C# - 负向前瞻似乎不起作用

use*_*276 5 c# regex regex-lookarounds

使用 C# .Net 4.5 工作

我需要一个表达式,该表达式将遍历字符串,如果字符串在字符串中的任何位置有两个或多个大写字符,则匹配失败。

我认为正确的模式应该是这样的:

(?![A-Z]{2,})\w
Run Code Online (Sandbox Code Playgroud)

注意:尝试了?!两者?<!

我得到了相反的工作,搜索一个字符串,如果连续有 2 个或更多大写字母,则返回 true,并且该模式如下:

(?=[A-Z]{2,})\w
Run Code Online (Sandbox Code Playgroud)

但我必须摆脱消极的前瞻模式。

从我读过的所有帖子来看,这应该是正确的方法,但它对我不起作用。

我读过以下问题:

C# 正则表达式负前瞻C# 中的正则表达式负前瞻

ETC...

我不想把它们全部列出来。但他们都说或多或少相同的事情,只是使用否定前瞻(?!)

任何人都可以看到我做错了什么而无法正常工作吗?

编辑:

添加了一些示例:

  1. 你好 - 应该通过
  2. 你好 - 应该失败
  3. 你好 - 应该失败
  4. 你好 - 应该会失败

进阶版:

  1. 你好世界 - 应该通过
  2. 你好世界 - 应该会失败
  3. 你好世界 - 应该会失败
  4. 你好世界 - 应该会失败

Wik*_*żew 3

您可以使用以下正则表达式:

^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

它也将匹配空字符串,但您可以使用+量词而不是*要求至少 1 个字符。

要将换行符与此模式匹配,您需要使用RegexOptions.Singleline修饰符。

(?!.*\b\w*\p{Lu}\w*\p{Lu})一旦发现以零个或多个单词字符开头,后跟一个大写字母,再后跟零个或多个单词字符,然后又是一个大写字母的单词,锚定在字符串开头的负向前查找将使匹配失败。您可以使用限制量词来缩短它:^(?!.*\b(?:\w*\p{Lu}){2}).*$