使用C#.Net 4.5
如果字符串在字符串中的任何位置有两个或多个大写字符,我需要一个能够查看字符串并使匹配失败的表达式。
我认为应该是正确的模式是这样的:
(?![A-Z]{2,})\w
注意:同时尝试?!
和?<!
我有相反的工作,搜索一个字符串,如果连续有2个或更多的帽子,则返回true,该模式如下:
(?=[A-Z]{2,})\w
但是我必须让这种方法脱离负面的前瞻模式。
在我读过的所有帖子中,这应该是正确的方法,但它对我不起作用。
我读过以下问题:
C# regexp negative lookahead 要么 Regex negative lookahead in c#
等...
我不想列出所有内容。但他们都或多或少地说同样的事情,只是使用负面的前瞻(?!)
任何人都可以看到我做错了什么不能工作吗?
编辑:
添加了一些例子:
高级版:
答案 0 :(得分:3)
您可以使用以下正则表达式:
^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$
请参阅regex demo
它也匹配空字符串,但您可以使用+
量词而不是*
来要求至少1个字符。
要使用此模式匹配换行符,您需要使用RegexOptions.Singleline
修饰符。
一旦找到一个以零个或多个单词字符开头的单词,后跟一个填充字母,再后跟零个或多个单词字符,锚定在字符串开头的负向前瞻(?!.*\b\w*\p{Lu}\w*\p{Lu})
将使匹配失败然后又是一个大写字母。您可以使用限制量词来缩短它:^(?!.*\b(?:\w*\p{Lu}){2}).*$
。
答案 1 :(得分:1)
如果你想要匹配某些东西,你只需要失败。
你想要匹配的是失败。
如果[A-Z].*?[A-Z]
匹配,则该字符串包含2个上限字母。
如果不是连续两个,那么它(多行) - &gt; ^[^A-Z\r\n]*(?:[A-Z](?![A-Z])[^A-Z\r\n]*)*$
要匹配非空字符串,只需添加一个简单的断言。
^(?!$)[^A-Z\r\n]*(?:[A-Z](?![A-Z])[^A-Z\r\n]*)*$
对于Unicode属性,请使用\p{Lu}
表单
^[^\p{Lu}\r\n]*(?:\p{Lu}(?!\p{Lu})[^\p{Lu}\r\n]*)*$
输入:
1.Hello - Should pass
2.HEllo - Should fail
3.heLLo - Should fail
4.HELLO - should fail
Advanced version:
1.Hello World - should pass
2.Hello WOrld - should fail
3.hello wORld - should fail
4.hello WORLD - should fail
基准
Regex1: ^(?!.*\b\w*\p{Lu}\w*\p{Lu}).*$
Options: < ICU - m >
Completed iterations: 80 / 80 ( x 1000 )
Matches found per iteration: 5
Elapsed Time: 8.28 s, 8279.28 ms, 8279281 µs
Regex2: ^[^\p{Lu}\r\n]*(?:\p{Lu}(?!\p{Lu})[^\p{Lu}\r\n]*)*$
Options: < ICU - m >
Completed iterations: 80 / 80 ( x 1000 )
Matches found per iteration: 5
Elapsed Time: 3.88 s, 3875.04 ms, 3875039 µs