我正在尝试创建一个正则表达式,其唯一数字用逗号分隔,最大5位,并且数字允许从1到10。例如
1,2,3,4,5-有效
1,2,2,4,5-无效(因为它允许定义重复的数字)
但是我想要一个只能输入唯一数字的正则表达式。
我在正则表达式下面提到允许逗号分隔的数字,并允许1-10之间的5位数字。
^([1-9] | 10)(?:,([1-9] | 10)){0,4} $
请帮助如何定义仅允许唯一数字的正则表达式
最佳答案
您可以使用
^(?!.*\b(\d+)\b.*\b\1\b)(?:[1-9]|10)(?:,(?:[1-9]|10)){0,4}$
参见online regex demo。
如果存在重复的相同数字块作为整个单词(用单词边界位置包围),则
(?!.*\b(\d+)\b.*\b\1\b)
否定超前查找将失败。请参见Java demo:
List<String> strs = Arrays.asList("1,2,3,4,5", "1,2,2,4,5");
String rx = "(?!.*\\b(\\d+)\\b.*\\b\\1\\b)(?:[1-9]|10)(?:,(?:[1-9]|10)){0,4}";
for (String str : strs)
System.out.println(str + ": " + str.matches(rx));
输出:
1,2,3,4,5: true
1,2,2,4,5: false
请注意,Java代码中省略了模式开头和结尾的
^
和$
,因为.matches
需要完整的字符串匹配。