在C#.Net 4.5中工作
我需要一个表达式,该表达式将查找字符串,并且如果字符串在字符串中的任意位置具有两个或多个大写字符,则匹配失败。
我认为应该是正确的模式是这样的:
(?![A-Z]{2,})\w
注意:尝试了
?!
和?<!
我得到相反的结果,搜索一个字符串,如果连续有两个或多个大写字母,并且模式如下,则返回true:
(?=[A-Z]{2,})\w
但是我必须在消极的前瞻模式下解决这个问题。
在我读过的所有文章中,这应该是正确的方法,但是它对我不起作用。
我已阅读以下问题:
C# regexp negative lookahead
要么
Regex negative lookahead in c#
等等...
我不想全部列出。但他们都说或多或少是同一件事,只是使用否定的前瞻(?!)
谁能看到我在做什么错而无法正常工作?
编辑:
添加了一些示例:
您好-应该通过
地狱-应该失败
您好-应该失败
HELLO-应该失败
进阶版本:
你好世界-应该通过
您好WOrld-应该失败
您好世界-应该失败
你好,世界-应该失败
最佳答案
您可以使用以下正则表达式:
^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$
见regex demo
它也将匹配空字符串,但是您可以使用
+
量词而不是*
来要求至少1个字符。要将换行符与此模式匹配,您将需要使用
RegexOptions.Singleline
修饰符。一旦找到一个单词,该单词以零个或多个单词字符开头,后跟一个大写字母,再一个零个或多个单词字符,然后再次大写,则锚定在字符串开头的否定前瞻
(?!.*\b\w*\p{Lu}\w*\p{Lu})
将使匹配失败。信件。您可以使用限制量词^(?!.*\b(?:\w*\p{Lu}){2}).*$
来缩短它。