如何对正则表达式取反?匹配非允许字符失败问题求助
解决正则取反不生效的问题
嘿,我一眼就看到你最后那条正则的问题啦!咱们一步步来捋清楚:
核心问题出在哪?
你写的最后一条正则是:
^([\d]|[A-Z]|[a-z]|[$%&*-_=+^])
这里的^是放在整个分组外面的,它的作用是匹配字符串的开头,而不是对字符类取反!要实现“匹配除指定字符外的其他字符”,得把^放在字符类[]的开头才行。
另外还有个隐藏坑:你原来的允许符号里的-放在了*和_中间,这会被正则解析成字符范围(从*到_的ASCII字符),这肯定不是你想要的,会导致很多意外的符号被当成允许字符。
修正后的正则
把^移到字符类内部开头,同时把-放到字符类的最开头或最结尾(避免被当成范围),修正后的正则应该是这样:
[^-0-9A-Za-z$%&*_=+^]
解释下每个部分:
[^...]:字符类取反,匹配任何不在这个类中的字符-放在最开头,明确表示这是一个普通的连字符,不是范围符号0-9A-Za-z:匹配数字、大小写字母(和你之前的需求一致)$%&*_=+^:你指定的允许符号
替换后的代码
把最后那个If语句里的正则替换成上面的就可以了,同时我也把第四个判断里的-移到了结尾,避免同样的范围问题:
If Regex.IsMatch(s, "\d+") Then something If Regex.IsMatch(s, "[A-Z]+") Then something If Regex.IsMatch(s, "[a-z]+") Then something If Regex.IsMatch(s, "[$%&*_=+^-]+") Then something If Regex.IsMatch(s, "[^-0-9A-Za-z$%&*_=+^]") Then something
顺便提一句:第一个正则里的[\d]+可以简化成\d+,字符类里单个元字符不需要额外加括号,不过不影响功能就是了。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

