2017-09-14 327 views
3

我最近一直在嘗試一些正則表達式。現在,我有3個符號a,b和c。正則表達式沒有2個連續的a和b的

我首先看了一個我不想連續2次的情況。正則表達式會是這樣的:

((b|c + a(b|c))*(a + epsilon) 

現在,我不知道是否有概括這個問題說的方式是這樣的:

正則表達式,沒有兩個連續的一個的沒有兩個連續的B的。我想這樣的東西:

(a(b|c) + b(a|c) + c)* (a + b + epsilon) 

但這接受輸入如「阿爸」或「BAAB」,這將有2個連續的A(或B的),這是不是我想要的。任何人都可以告訴我一個出路嗎?

回答

3

如果你不能做一個否定匹配,那麼也許你可以使用負向預測排除匹配aabb的字符串?像下面(參見Regex 101獲得更多信息):

(?!.*(aa|bb).*)^.*$ 
+1

這看起來的確是一個偉大的想法。負面的前瞻將會做到這一點。我接受這個答案。 – paratrooper

2

I(認爲I)通過使用FSM2Regex手寫一有限狀態機,然後,產生一個正則表達式解決了這個。狀態機寫入以下(從網站的語法):

#states 
s0 
s1 
s2 
s3 
#initial 
s0 
#accepting 
s1 
s2 
s3 
#alphabet 
a 
b 
c 
#transitions 
s0:a>s1 
s0:b>s2 
s0:c>s3 
s1:b>s2 
s1:c>s3 
s2:a>s1 
s2:c>s3 
s3:c>s3 
s3:a>s1 
s3:b>s2 

enter image description here

如果你看的過渡,你會發現它是相當straightforward-我有一個對應於一個狀態「匯「字母的每個字母,我只允許從其他字母(不是」匯「字母)轉換出該狀態。例如,s1a的「接收器」。從其他所有州,您可以使用as1。但是,如果您使用的是s1,則只能使用bc,它們分別擁有自己的「接收器」s2s3。因爲我們可以重複c,s3在字符c上有一個轉換。將塊文本粘貼到網站中,它將爲您繪製所有內容,並生成正則表達式。

這對我所產生的正則表達式是:

c+cc*(c+$+b+a)+(b+cc*b)(cc*b)*(c+cc*(c+$+b+a)+$+a)+(a+cc*a+(b+cc*b)(cc*b)*(a+cc*a))(cc*a+(b+cc*b)(cc*b)*(a+cc*a))*(c+cc*(c+$+b+a)+(b+cc*b)(cc*b)*(c+cc*(c+$+b+a)+$+a)+b+$)+b+a 

其中,我敢肯定,是不是最佳的:)

編輯:產生正則表達式使用+作爲首選運營商(通常稱之爲給我們的編碼者,如|),這意味着它可能不適合粘貼到代碼中。不過,我太害怕改變和風險毀了我的正則表達式:)

0

您可以使用反向引用匹配上一個字符

string input = "acbbaacbba"; 
string pattern = @"([ab])\1"; 
var matchList = Regex.Matches(input, pattern); 

此模式將匹配:BB,AA和BB。如果您的輸入模式中沒有任何匹配,則表示它不包含重複的a或b。

說明:

([AB]):定義一組,可以在此處延伸的符號

\ 1:回引用該組的,因此,例如,當 'a' 被匹配,\ 1。將「一」

檢查此頁:http://www.regular-expressions.info/backref.html

相關問題