在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}).*$来缩短它。

09-26 08:12