2012-05-16 32 views
1

我有一系列逗號分隔的單詞,如x1,x2,x3 ....這個序列中的某些單詞可能是可選的,即序列x1,x3,x4,x6是有效的,x2和x5是可選的,而其餘​​的話是強制性的。上述順序最多可重複n次。正則表達式驗證序列

對於離,詞語X1,X2的序列,X 3可以與X 2是可選被重複3次最大,以下是有效的序列:X1,X3,X1,X2,X3,X1,X3

如何使用正則表達式驗證上述內容?

我想是這樣 (,{0,1}x1,(x2,){0,1}x3,{0,1}){3} 但上面會三的倍數工作,如果我使用{1,3},然後重複的任何款項將匹配,因爲他們的倍數1 {,3 }。

+0

您能否提供更多有效和無效的示例序列?例如:你是否嚴格按照升序排列數字? – ohaal

回答

2

您的示例工作正常,但正如您所注意的那樣,您只檢查目標字符串是否包含的匹配字符序列。您需要使用\A\z來確定整個字符串匹配的錨點字符串開始和結束處的正則表達式。

此外,{0,1}更簡單地寫爲?,並且捕獲括號(...)更好地寫成非捕獲那些(?: ...)當你不需要捕捉子。

嘗試對您的正則表達式進行此修改,該修改使用/x修飾符來允許將不重要的空白添加到表達式中,以更好地佈置它。

m/ \A (?: x1, (?: x2,)? x3 ,?){1,3} \z /x; 
+0

很好的答案,但是正則表達式會產生一些誤報:例如'x1,x2,x3x1,x2,x3'(注意連接到兩個子序列的缺失逗號)。您可以使用替代來指定逗號或字符串結尾:'(?:,| \ z)',而不是使最後的逗號爲可選。 – FMc