使用正则表达式匹配一系列数字1-9,不重复。

7
我需要能够匹配一系列数字(任何一个在19之间的数字),并且可以匹配用户输入的不同数字,但不能重复。

123456789 -> 匹配
1223 -> 不匹配

实际上,这个数字必须在1到9位之间,只包含数字,且不重复任何数字。 如何使用正则表达式实现此功能?

2
这些数字必须有序吗? - dee-see
4个回答

3

类似下面这样的代码应该可以工作:

(?!.*([1-9]).*\1)^[1-9]{1,9}$

(?!.*([1-9]).*\1) - 负向先行断言,检查数字是否不重复。

示例匹配: http://regexr.com?2trr6


我无法让它与我的样本数字“12351874”匹配。你可以吗?编辑:除非他们不希望以前使用的数字出现在字符串中的任何位置... - Brad Christie
这不应该匹配——数字“1”被重复了。这个解决方案正确地指出了这不匹配。 - Tadmas
@Brad Christie - 抱歉,我不太理解你在这里的问题。 - manojlds
+1 - 你比我先完成了。 (这个问题比看起来更难。)我知道向前/向后看是关键,但没有想到你可以像那样向前看整个东西。干得好! - Tadmas

1

我老实说用的 PHP 比 C# 多,但这个应该可以工作。

^(?:([1-9])(?![1-9]*?\1))*$

0

这里有一个不同的解决方案。这是我会做的方式。除非它们真的能让代码更容易,否则我不是先行/后行查找的忠实粉丝。

string numbers = "123456789";
string example = "12345 1123456 19283741 987654321";

var matches = Regex.Matches(example, @"\d+");
for (int i = 0; i < matches.Count; i++) {
    var match = matches[i].Value;
    if (!numbers.Any(number => match.Count(x => x == number) >= 2)) {
        Console.WriteLine(match);
    }
}

如果你运行它,你会看到它打印出:
12345
987654321

我认为我的操作非常简单明了。

我正在从文本中提取所有数字,无论它们是否有重复的数字,并且对于每个数字(1-9),它只会选择那些不包含多个重复数字的匹配项。


0
^(?:([1-9])(?!\1))+$

也就是说,一个数字,后面跟着至少一次不同的数字。

抱歉,我误解了问题。我以为你的意思是如果连续使用相同的数字应该失败。如果您希望整个数字序列没有重复,请使用:

^(?:([1-9])(?!.*\1))+$

问题不是很清楚,但我预计每个数字只允许出现一次,例如“123123”将不匹配。 - Kirk Broadhurst
抱歉,我误解了。我以为你的意思是只有当数字连续出现两次时才算(例如1221)。我会进行更新。 - porges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接