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)之后
该模式未锚定到字符串的末尾。尝试
!Regex.IsMatch("1234567-8A","[0123456789]+-[0123456789K]$")
编辑:或
!Regex.IsMatch("1234567-8A","^[0123456789]+-[0123456789K]$")
锚定到开头和结尾(以匹配整个字符串)。
关于{1}
,没有必要的原因是字符类 [0123456789K] 已经表示“匹配此列表中的一个字符”。添加{1}
不会将其更改为“匹配此列表中的一个字符,之后不再匹配”。你需要那个$
锚。
有关该模式中锚点的信息,请参阅http://msdn.microsoft.com/en-us/library/az24scfc.aspx。
您的正则表达式匹配,因为它是匹配的。您没有指定这是字符串的结尾,并且您的测试字符串确实在末尾有一个数字。试试这个:
[0123456789]+-[0123456789K]{1}$
表示字符串的$
结尾。
或者更好的是,也^
用于字符串的开头:
^[0123456789]+-[0123456789K]{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')
作为旁白,你可以这样写你的模式:
^[0-9]+-[0-9K]$