2017-06-02 59 views
2

我有一個字母數字字符串(M-T-D-S-F1-F2),我需要確保alnum(F1)的組合只在字符串中存在一次。正則表達式只能匹配一個字母數字組合

例字符串:M-T-D-S-F1-F2

我使用的正則表達式是/^[^F1]*F1?[^F1]*$/

M-T-D-S-F1 -> Matches 
M-T-D-S-F1 F -> Doesn't match (Since it is not matching F1 literally) 
M-T-D-S-F1 F2 -> Doesn't match 

問題是正則表達式失敗,本F2。我需要將F1視爲一個組合,並且從字面上進行匹配。

我該怎麼做?

+0

只是爲了澄清一下,你想在一個單詞中只用一次(用破折號)匹配'F1'?即這兩個將通過:M-T-D-S-F1,M-T-D-S-F1 F2;但這兩個將會失敗'M-T-D-S-F1-F1','M-T-D-S-F1-F9'? – SWLim

回答

4

如果你想確保沒有2 F1作爲一個字符串整個單詞,用一個簡單的正則表達式/\bF1\b/和檢查匹配的.count。如果有大於1,該字符串是無效的,否則,它是有效的:

String s = "M-T-D-S-F1-F2"; 
def m = s =~ /\bF1\b/; 
if (m.count > 1) { 
    println("FAIL!"); 
} else { 
    println("VALID"); 
} 

看到一個Groovy demo online

純的正則表達式的解決方案是可能的,但是低效的:

/^(?!.*\bF1\b.*\bF1\b)/ 

regex demo

它一個字符串的開頭匹配,然後如果有後零個或多個字符(.*)整個單詞F1負先行((?!...))失敗的任意字符串,隨後用0+字符,再整個單詞F1

+0

這兩種解決方案都可以很容易地適應需要'F1'至少一次。 1)'m.count == 1'和2)'/ ^(?!。* \ bF1 \ b。* \ bF1 \ b)。* \ bF1 \ b /' –

相關問題