1
if (!Regex.IsMatch("1234567-8A","[0123456789]+-[0123456789K]{1}"))
    Console.WriteLine("It is not match");
else
    Console.WriteLine("It is match");

这会输出“匹配”,但不应该。

为什么{1}不工作?

-我明确想要 1 个字符(0 或 1 或 2 或 ... 或 9 或 K)之后

4

4 回答 4

9

该模式未锚定到字符串的末尾。尝试

!Regex.IsMatch("1234567-8A","[0123456789]+-[0123456789K]$")

编辑:或

!Regex.IsMatch("1234567-8A","^[0123456789]+-[0123456789K]$")

锚定到开头和结尾(以匹配整个字符串)。

关于{1},没有必要的原因是字符类 [0123456789K] 已经表示“匹配此列表中的一个字符”。添加{1}不会将其更改为“匹配此列表中的一个字符,之后不再匹配”。你需要那个$锚。

有关该模式中锚点的信息,请参阅http://msdn.microsoft.com/en-us/library/az24scfc.aspx

于 2013-06-19T14:20:21.300 回答
1

您的正则表达式匹配,因为它是匹配的。您没有指定这是字符串的结尾,并且您的测试字符串确实在末尾有一个数字。试试这个:

[0123456789]+-[0123456789K]{1}$

表示字符串的$结尾。

或者更好的是,也^用于字符串的开头:

^[0123456789]+-[0123456789K]{1}$
于 2013-06-19T14:21:08.070 回答
1

不需要正则表达式:

var parts = "1234567-8A".Split('-');
bool match = parts.Length == 2 && parts[0].All(c=> char.IsNumber(c))
                               && parts[1].Length == 1 
                               && (char.IsNumber(parts[1][1])
                                        || parts[1][1] == 'K')
于 2013-06-19T14:37:13.977 回答
0

作为旁白,你可以这样写你的模式:

^[0-9]+-[0-9K]$
于 2013-06-19T14:29:23.623 回答