正则表达式仅匹配字母数字组合一次

时间:2017-06-02 18:48:00

标签: java regex groovy

我有一个字母数字字符串(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视为一个组合并按字面意思匹配。

我该怎么做?

1 个答案:

答案 0 :(得分: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