在 C# .Net 4.5 中工作
我需要一个表达式来查找字符串并在字符串中的任何位置有两个或更多大写字符时匹配失败。
我认为正确的模式应该是这样的:
(?![A-Z]{2,})\w
注意:都试过了 ?!
和 ?<!
我得到了相反的工作,搜索一个字符串,如果连续有 2 个或更多的 cap,则返回 true,并且该模式如下:
(?=[A-Z]{2,})\w
但我必须让这个工作脱离负先行模式。
从我读过的所有帖子来看,这应该是正确的方法,但它对我不起作用。
我已经通读了以下问题:
C# regexp negative lookahead 或者 Regex negative lookahead in c#
等...
我不想一一列举。但他们或多或少都说了同样的话,只是使用否定的前瞻性(?!)
任何人都可以看到我做错了什么导致它不起作用吗?
编辑:
添加了一些示例:
- 你好 - 应该过去
- 你好 - 应该失败
- heLLo - 应该失败
- 你好 - 应该会失败
进阶版:
- Hello World - 应该通过
- Hello WOrld - 应该会失败
- 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}).*$
.
关于C# - 负先行似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728662/