2010-06-24 172 views

回答

68

如果要匹配非字母数字符号,请使用\W|_

Regex pattern = new Regex(@"\W|_"); 

这将匹配除0-9和a-z以外的任何内容。有关\W角色等级和其他可在此处获得的信息。

+2

不是为了挑战大师,而是你不是指'\ W'? '\ w'(小写字母w)匹配所有单词字符。 – Alan 2010-06-24 21:38:31

+4

这几乎是完全错误的。 – 2010-06-24 21:42:49

+2

然而,它得到3 upvotes。 – Alan 2010-06-24 21:44:19

2

您可以检查相反的情况?

Match match = Regex.Match(@"^([a-zA-Z0-9]+)$"); 
if (!match.Success) { 
    // it's alphanumeric 
} else { 
    // it has one of those characters in it. 
} 
10

你也可以避免正则表达式,如果你想:

return s.Any(c => !char.IsLetterOrDigit(c)) 
+1

现在获得额外的信用:哪个性能更好? – Alan 2010-06-24 21:40:43

+0

嘿嘿..有时你只需要使用正则表达式的一切:)即使我喜欢正则表达式,通常最好避免它们。 – simendsjo 2010-06-24 21:41:02

+0

@Alan - 稍后我会运行一个测试(除非其他人发出响声),但我相信这会更快一些。 – ChaosPandion 2010-06-24 21:45:58

2

我没有得到你的整个问题,但这正则表达式匹配包含至少一个非字母数字字符那些字符串。这包括空白(虽然看不到你的列表中)

[^\w]+ 
2

你的正则表达式只需要很少的调整。连字符用于形成A-Z等范围,因此如果要匹配文字连字符,则必须使用反斜杠将其转义或将其移至列表的末尾。您还需要转义方括号,因为它们是字符类的分隔符。然后在开始时摆脱这个问号,并且你在做生意。

Regex symbolPattern = new Regex(@"[[email protected]#$%^&*()_+=\[{\]};:<>|./?,-]"); 

如果你只想匹配ASCII标点符号,这可能是最简单的方法。 \W除了标点符号之外还匹配空格和控制字符,并且它与整个Unicode范围中的它们匹配,而不仅仅是ASCII。

虽然您似乎错过了几个字符:反斜杠,撇号和引号。添加这些为您提供:

@"[[email protected]#$%^&*()_+=\[{\]};:<>|./?,\\'""-]" 

最后,这是一个好主意,始终使用C#的逐字字符串(@"...")的正则表达式;它可以为反斜杠节省很多麻烦。引号是通过加倍来逃脱的。

相关问题