我正在尝试为其中至少包含1个非字母数字符号的字符串创建正则表达式
我尝试使用的代码是
Regex symbolPattern = new Regex("?[!@#$%^&*()_-+=[{]};:<>|./?.]");
我只想匹配!@#$%^&*()_-+=[{]};:<>|./?.
中的一个,但它似乎没有效果。
答案 0 :(得分:74)
如果您想匹配非字母数字符号,请使用\W|_
。
Regex pattern = new Regex(@"\W|_");
这将匹配除0-9和a-z之外的任何内容。有关\W
字符类的信息以及此处提供的其他信息。
答案 1 :(得分:10)
如果您愿意,也可以避免使用正则表达式:
return s.Any(c => !char.IsLetterOrDigit(c))
答案 2 :(得分:2)
你能检查相反的情况吗?
Match match = Regex.Match(@"^([a-zA-Z0-9]+)$");
if (!match.Success) {
// it's alphanumeric
} else {
// it has one of those characters in it.
}
答案 3 :(得分:2)
我没有得到你的整个问题,但是这个正则表达式将匹配那些包含至少一个非字母数字字符的字符串。这包括空格(虽然在你的列表中看不到)
[^\w]+
答案 4 :(得分:2)
你的正则表达式只需要很少的调整。连字符用于形成A-Z
之类的范围,因此如果要匹配文字连字符,则必须使用反斜杠将其转义或将其移至列表的末尾。您还需要转义方括号,因为它们是字符类的分隔符。然后在开始时摆脱那个问号,你就是在做生意。
Regex symbolPattern = new Regex(@"[!@#$%^&*()_+=\[{\]};:<>|./?,-]");
如果您只想匹配ASCII标点字符,这可能是最简单的方法。 \W
除了标点符号外还匹配空格和控制字符,并且它与整个Unicode范围匹配,而不仅仅是ASCII。
你似乎错过了几个字符:反斜杠,撇号和引号。添加它们会给你:
@"[!@#$%^&*()_+=\[{\]};:<>|./?,\\'""-]"
最后,总是将C#的逐字字符串文字(@"..."
)用于正则表达式是个好主意;它可以为您节省大量的反斜杠麻烦。报价标记通过加倍来逃避。