2011-03-07 108 views
1

需要一個模式來匹配它不應該是一個字符串 -正則表達式UNMATCH在VB.NET或C#

777777777 
888888888 
999999999 

000204啓動。

當我試圖去創造一個模式來匹配上述要求,我得到它所做 -

Dim _pattern6 As String = "^(7+|8+|9+|(00|07|08|09|17|18|19|28|29|43|48|69|70|78|79|80|96|97).*)$" 

無法得到的不匹配部分完成。

回答

1

您可以嘗試匹配不需要的部分。如果該結果爲真,則知道「不匹配」的嘗試將是錯誤的,反之亦然。

3

你想要的是negative lookahead

@"^(?!([789])\1{8}$|0[024]).*$" 

負先行(?!...)意思是「任何遵循此位置不能匹配任何這些模式」。所以(?!7{9}).*的意思是「任何字符串(.*),它不是以連續九個7 s開頭。」 ([789])\1{8}$是9位重複數字的簡寫。它的意思是「7,8或9,其次是8次」。

測試在RegexPlanet:http://fiddle.re/tz8p

+0

我從來沒有試圖把兩個'$'的在正則表達式的結束,它的工作原理? (儘管我認爲你只是第一次看它而不是匹配它)。所以,先生+1。 – 2011-03-08 05:29:52

+0

@jb - 更正:第一個'$'只是說隨便什麼都不是同一個數字[7-9]中的9和行尾。只要結果仍然合理,'$'在正則表達式中的任何地方都是有效的,所以'(^ foo $ |^bar $ |^baz $)'可以正常工作,而'foo $ bar $'則不會。感謝+1。 :) – 2011-03-08 05:55:06

-2

在這裏你去

[^(7{9}|8{9}|9{9}|00|02|04)]+ 
+1

這不是負面的字符類的工作方式。如果您沒有收到運行時錯誤,我很確定這將會查找組中特殊字符的文字版本。 – 2011-03-07 22:35:06

+0

這簡化到'[^ 024789] +'ie「除了這些數字之外的任何東西」 – 2011-03-08 05:27:43

+0

@賈斯汀的權利; '[^(7 {9} | 8 {9} | 9 {9} | 00 | 02 | 04)]'相當於'[^ 024789(){} |]',匹配** ** **字符,只要它不在列表中。 – 2011-03-08 05:34:21