2010-12-13 115 views
1

我想用正则表达式来检查一个名字,但是我没有得到令人信服的结果。任何人都可以请建议我在我的正则表达式模式中做了什么错误?正则表达式混淆

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作为输出。我需要什么修改?

+1

听起来像你*需要*做的是'str_replace(“_”,“”,$ username)''。但除非你更好地描述你的问题,或者再举几个例子,否则谁都不会知道。 – mpen 2010-12-13 06:36:59

回答

1

您的字符范围的前半部分是包括它

[A-za-z]从下壳体创建一个从上壳A中的范围到下壳体Z,然后另一个范围以小写字母z表示,这些范围在第二部分重叠,这是因为ASCII值的工作方式,具体来说,A-z创建了从ASCII字符65(A)到字符12 2(z)。下划线字符的值为95,介于两者之间。由于你的正则表达式被锚定,所以这个字符类别为is where the match is occurring。我已经改变了你的角色类,在这个例子中包含了组合括号,这样你就可以看到它正在捕获“Jack_Sparrow”的全部文本。

您应该可以通过将字符范围更改为[A-Za-z]来解决此特定匹配问题。但是,它仍然会匹配第一部分(“杰克”),然后[^-]*部分将匹配字符串的其余部分(“_Sparrow”),仍然使其成为有效匹配。如果您可以提供一些其他文本示例,那么我们可以帮助您进一步细化。根据您提供的当前信息,很难说明如何最好地解决[^-]问题。

+0

查尔斯仍然是对的,即使他解决了这个问题,它也会因'[^ - ]'而继续匹配。 – mpen 2010-12-13 06:29:19

+0

@Ralph:是的,只是指出。我以前应该提到过。 – eldarerathis 2010-12-13 06:30:18

+0

错误..不是真的。他用'$'结束他的正则表达式。它必须匹配到字符串的末尾,否则它将不匹配。这将*不匹配只有“杰克”。 – mpen 2010-12-13 06:34:11

1

[^-]检查除 - 以外的任何字符,以便匹配下划线。我不确定你想在这里匹配什么。

您是否试图将字母以外的所有内容都改为空格?在 (Regex.Matches

+0

如果我省略[^ - ],然后我将“Jack_Sparrow”作为输出。我可以知道为什么吗? – Justin 2010-12-13 06:25:02

0

的foreach(匹配度M( “Jack_Sparrow”, “[^ A-ZA-Z]”)) { Console.WriteLine( “{0}发现在索引{1}”, m.Value,m.Index); }