c# – 正则表达式重复

我正在使用正则表达式来检查文本行.
1,3,4,5,8,10,12,14,19,14

这里的数字用’,’分隔,应该是非内容的,小于或等于20.
而且任何数字都不应该重复.
这是我的模式.

^(?:(?:0[1-9]|[1-9]|1[0-9]|20),)*(?:0[1-9]|[1-9]|1[0-9]|20)$

但它不能检查重复.我该怎么检查?

解决方法

你想做的不是那么复杂.您只需要在每个匹配的数字后检查,如果该数字再次出现在字符串中:
^(?:(0[1-9]|[1-9]|1[0-9]|20),(?!.*\b\1\b))*(?:0[1-9]|[1-9]|1[0-9]|20)$

看到它并测试它here on Regexr.

在C#中:

string[] myStrings = { "1","1,2","01,2,6,7,9,11,13,15,16,17,18,20",02,03,04,05,06,07,08,09,20,5",20" };

Regex reg = new Regex(
    @"^
        (?:(0[1-9]|[1-9]|1[0-9]|20),(?!.*\b\1\b) # Fail if the before matched number occurs once more
        )*
        (?:0[1-9]|[1-9]|1[0-9]|20)
    $",RegexOptions.IgnorePatternWhitespace
);

foreach (string myString in myStrings)
    Console.WriteLine("{0} {1} a valid string.",myString,reg.IsMatch(myString) ? "is" : "is not"
    );

Console.ReadLine();

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...