2017-06-02 11 views
2

アルファベットの文字列(M-T-D-S-F1-F2)を使用しています。アルファベットの組み合わせに一度だけ一致する正規表現

例文字列:M-T-D-S-F1-F2

私が使用している正規表現はこの問題は、正規表現が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 

です。私はF1をコンビネーションとして考え、文字通り一致する必要があります。

どうすればいいですか?

+0

明確にするために、ちょうど単語(ダッシュ)で 'F1'を一度だけ一致させたいとしますか?すなわち、これらの2つは、「M-T-D-S-F1」、「M-T-D-S-F1 F2」、 M-T-D-S-F1-F1」、「M-T-D-S-F1-F9」はこれらの2つが失敗するでしょうか? – 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

ここの両方のソリューションは、少なくとも1回は 'F1'を要求するように簡単に適応できます。 * \ bF1 \ b/'(1)' m.count == 1 ' –

関連する問題