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

时间:2016-01-11 18:39:12

标签: c# regex lookahead negative-lookahead

使用C#.Net 4.5

如果字符串在字符串中的任何位置有两个或多个大写字符,我需要一个能够查看字符串并使匹配失败的表达式。

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

(?![A-Z]{2,})\w

注意:同时尝试?!?<!

我有相反的工作,搜索一个字符串,如果连续有2个或更多的帽子,则返回true,该模式如下:

(?=[A-Z]{2,})\w

但是我必须让这种方法脱离负面的前瞻模式。

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

我读过以下问题:

C# regexp negative lookahead 要么 Regex negative lookahead in c#

等...

我不想列出所有内容。但他们都或多或少地说同样的事情,只是使用负面的前瞻(?!)

任何人都可以看到我做错了什么不能工作吗?

编辑:

添加了一些例子:

  1. 您好 - 应该通过
  2. HEllo - 应该失败
  3. heLLo - 应该失败
  4. 你好 - 应该失败
  5. 高级版:

    1. Hello World - 应该通过
    2. 你好WOrld - 应该失败
    3. 你好wORld - 应该失败
    4. 你好世界 - 应该失败

2 个答案:

答案 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