C# - 负先行似乎不起作用

标签 c# regex lookahead negative-lookahead

在 C# .Net 4.5 中工作

我需要一个表达式来查找字符串并在字符串中的任何位置有两个或更多大写字符时匹配失败。

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

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

注意:都试过了 ?!?<!

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

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

但我必须让这个工作脱离负先行模式。

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

我已经通读了以下问题:

C# regexp negative lookahead 或者 Regex negative lookahead in c#

等...

我不想一一列举。但他们或多或少都说了同样的话,只是使用否定的前瞻性(?!)

任何人都可以看到我做错了什么导致它不起作用吗?

编辑:

添加了一些示例:

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

进阶版:

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

最佳答案

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

^(?!.*\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/

相关文章:

c# - 为 COM Interop 注册 x64 程序集的问题

c# - 事件日志查询 : How to form query string?

regex - 正则表达式查询es 1.7

regex - 如何使用存储在字段值中的正则表达式执行正则表达式查找?

javascript - 禁止小数进入文本框不起作用

正则表达式:两次比赛之间的否定超前

c# - 从 xml 文件生成 xmldocument 对象的最快方法

c# - Marketo API 是否支持发送带有动态正文、主题和收件人的电子邮件?

regex - Perl 正则表达式 : How to remove quotes inside quotes from CSV line

regex - 我可以在所有情况下使用 (?=...)|(?<=...) 而不是独立的 (?=...) 或 (?<=...) 吗?