我试图编写一个正则表达式来计算数字列表,以便其中的任何两个元素都是不同的。我将使用它来验证 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
称为单词边界,在单词字符和非单词字符之间进行匹配。
如果还想匹配只包含一个数字的字符串,请将上述非捕获组后面的+
改为*
。
^(?!.*\b(\d+)\b.*\b\1\b)\d+(?:,\s+\d+)*$
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/