我想使用正则表达式检查名称,但我没有得到令人信服的结果。任何人都可以建议我在正则表达式模式中做错了什么?
foreach(Match m in
(Regex.Matches("Jack_Sparrow","^[A-za-z]+[^-]*(\\d)*$")))
{
Console.WriteLine("{0} found at index{1}",m.Value,m.Index);
}
我可以知道为什么我将 Jack_Sparrow 作为输出,尽管没有检查模式中的下划线(_)?我宁愿 Jack Sparrow 作为输出。我需要什么修改?
答案 0 :(得分:1)
[^-]
检查除 - 之外的任何字符,以便与下划线匹配。我不确定你想在这里找到什么。
您是否尝试将字母以外的所有内容更改为空格?
答案 1 :(得分:1)
角色范围的前半部分包括它。
[A-za-z]
创建一个范围,从大写字母A到小写字母z,然后是从小写字母a到小写字母z的另一个范围。由于ASCII值的计算方式,这些范围在第二部分重叠。具体来说,A-z
创建从ASCII字符65(A)到字符122(z)的范围。下划线字符的值为95,介于两者之间。由于您的正则表达式已锚定,因此此字符类is where the match is occurring。我已经更改了你的角色类,在这个例子中包括分组括号,这样你就可以看到它正在捕获“Jack_Sparrow”的整个文本。
您应该可以通过将字符范围更改为[A-Za-z]
来解决此特定匹配。但是,它仍将匹配第一部分(“杰克”),然后[^-]*
部分将匹配字符串的其余部分(“_Sparrow”),仍然使其成为有效匹配。如果您可以提供其他一些文本示例,那么我们可以帮助您进一步完善此示例。根据您提供的最新信息,很难说明如何最好地解决[^-]
问题。
答案 2 :(得分:0)
foreach(匹配m in (Regex.Matches(“Jack_Sparrow”,“[^ A-Za-z]”)) { Console.WriteLine(“{0}在索引{1}处找到”,m.Value,m.Index); }