java - 如何编写与不包含两个相同数字的数字列表匹配的正则表达式

标签 java regex

我试图编写一个正则表达式来计算数字列表,以便其中的任何两个元素都是不同的。我将使用它来验证 java jsf 网页上的文本框字段。例如:

1, 23,  12 // ok
1, 1, 2, 45  // fail 
1, 2, 4, 6, 7 // ok
1, 2, 3, 3   //fail

我写了正则表达式^[1-9](|[0-9])+(|\s+)(|\s+,\s+[1-9](|[0-9]) +(|\s+))+$,但它与我提供的 2 和 4 个示例相匹配。我该如何纠正这个问题?

最佳答案

使用下面的negative lookahead基于正则表达式。

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\s+\d+)+$

(?!.*\b(\d+)\b.*\b\1\b) 在开始处断言我们的字符串中不会有任何重复的数字去比赛。 \b 称为单词边界,在单词字符和非单词字符之间进行匹配。

DEMO

如果还想匹配只包含一个数字的字符串,请将上述非捕获组后面的+改为*

^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\s+\d+)*$

DEMO

Java 正则表达式是,

"^(?!.*\\b(\\d+)\\b.*\\b\\1\\b)\\d+(?:,\\s+\\d+)+$"

示例:

String[] s = {"1, 23,  12", "1, 2, 4, 6, 7", "1, 1, 2, 45", "1, 2, 3, 3", "1, 2, 1"};
for (String i: s)
{
    System.out.println(i.matches("(?!.*\\b(\\d+)\\b.*\\b\\1\\b)\\d+(?:,\\s+\\d+)+"));
}

输出:

true
true
false
false
false

关于java - 如何编写与不包含两个相同数字的数字列表匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27655182/

相关文章:

java - 注册匿名类功能

java - Tesseract - 找不到指定的模块

java - 多行java正则表达式中的反向引用

javascript - 获取所有不匹配Javascript中的正则表达式模式的字符

regex - (^?)* 在这个正则表达式中是什么意思?

java - CDI:来自同一 bean 的非拦截方法的拦截方法嵌套调用 - 应该调用吗?

java - ObjC – 从数组中的对象获取值(NSMutableArray)

java - 停止 Java 时不执行存储过程

字符串的 Python 正则表达式到字符或行尾

python - 使用 Python 在每行的第一个和第二个单词后插入逗号?