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

标签 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 视为组合并按字面匹配。

我该怎么做?

最佳答案

如果您想确保字符串中不存在 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

关于java - 正则表达式仅匹配字母数字组合一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44335594/

相关文章:

regex - 正则表达式量词 : . * 和 .* 有什么区别?

hibernate - 从 Grails 中域对象的子属性列表创建对子属性的属性进行操作的条件限制

rest - Jenkins:Active Choices Parameter + Groovy 构建基于 REST 响应者的列表

java - 在列表列表中找到最小大小的列表

正则表达式查找两个或多个连续字符

c# - 可以匹配具有任意小数位数的非零 float 的最短正则表达式是什么?

grails - 阻止女孩添加.JSP文件扩展名

Java:为什么可变参数没有按预期在 Eclipse 中更新?

java - 从字符串值设置 Android 图像

java - nextInt() 扫描仪错误