我有一个字母数字字符串(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 视为组合并按字面匹配。
我该怎么做?
最佳答案
如果您想确保字符串中不存在 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
。
关于java - 正则表达式仅匹配字母数字组合一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44335594/