我有一个字母数字字符串(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 :(得分: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");
}
纯正的正则表达式解决方案是可行的,但效率低下:
/^(?!.*\bF1\b.*\bF1\b)/
请参阅regex demo。
匹配字符串的开头,然后如果在零个或多个字符((?!...)
)之后存在整个单词F1
,则负向前瞻(.*
)将失败任何字符串有0+个字符,再一个字F1
。