【问题标题】:Regex for non-consecutive upper-case words非连续大写单词的正则表达式
【发布时间】:2013-12-29 21:30:54
【问题描述】:

这里有一个正则表达式向导。

这是在 Notepad++ 中使用的,即直接输入到搜索和替换对话框中。

我需要匹配并突出显示嵌套在字符串中的两个或多个字符的大写字母的孤立单词,但大写单词不能连续,它们必须始终被小写单词(或小写名词与第一个字母大写)或在句子的开头或结尾,后面或前面是小写单词(或再次是第一个字母大写的单词。

即。

给定字符串这是一个包含一些大写单词的句子。

我需要匹配“WITH而不是“WORDS”或“IN”,因为 WORDS 后面跟着另一个大写的单词,而 IN 前面是相同的。

字符串应该是多行的。

我尝试过前瞻,但失败了

任何帮助将不胜感激!

:-) 谢谢

【问题讨论】:

    标签: regex notepad++


    【解决方案1】:

    您应该使用负前瞻和负后瞻来检查周围的字符:

    (?<![A-Z]\s)\b[A-Z]+\b(?!\s[A-Z])
    

    Live demo

    Notepad++ v6.5.1 & 也适用于多行用途

    【讨论】:

    • 抱歉,Notepad++ 中没有负面回顾
    • @Jerry 是的。还添加了图像。
    • @revo Ahh,昨天发布的那个确实允许后视。虽然 Ωmega 的观点也是有效的。
    • 非常感谢所有回答的人,出色的工作!现在这里有一个进一步的转折。除了孤立的大写单词之外,如何否定它以匹配大写字母中的所有单词?我尝试将负数改为正数,但无法成功?
    【解决方案2】:

    我尝试了该正则表达式,当我使用 Notepad++ 查找/替换的“标记”功能时,它对我有用。不过我不确定您是否还有其他测试用例。

    (?:[[:lower:]][^A-Za-z]*|\A)\K\b[[:upper:]]+\b(?=[^A-Za-z]*[[:lower:]]|\Z)
    

    我使用 \A\Z 因为你提到了多行。

    regex101 demo(有一些解释)。

    一定要检查“匹配大小写”。

    之前:

    之后:

    编辑:根据更新,为了反转突出显示,我想出了那个……有点冗长:

    [^A-Z]+|(?:(?=[A-Z]*[a-z])\b[A-Za-z]+\b)|(?:\b[A-Z]+\b(?=[^a-z]+[A-Z])(?:[^a-z]*[A-Z]+)*)
    

    regex101 demo

    【讨论】:

      【解决方案3】:

      我会试试的

      (^|\.\s+|[a-z]\s+)([A-Z]+)(\.|\s+[a-z]|$)
      

      匹配:句点或行首或小写单词的结尾;后跟一个大写单词;后跟句点、行尾或小写单词的开头。

      单词本身在组 2 中匹配。如果 Notepad++ 支持环视断言,您可以这样做,以便捕获的唯一单词是单个大写单词:

      (?:^|\.\s+|[a-z]\s+)([A-Z]+)(?:\.|\s+[a-z]|$)
      

      【讨论】:

        【解决方案4】:

        我会使用

        (?<![[:upper:]]) ([[:upper:]]+) (?!([[:upper:]]| )+)
        

        这还将选择您的语言环境认为是大写的任何内容,而不仅仅是 A-Z

        【讨论】:

          【解决方案5】:

          你可以使用这个模式:

          (?:[^A-Z]\s+|[^a-zA-Z\s]|\A)\K[A-Z]+\b(?!\s+[A-Z])
          

          【讨论】:

          • @revo: 没有
          • Notepad++也不支持非捕获组(?:
          • wiki里没有提到,但是非捕获组在我用的时候一直在N++中工作。
          • @revo 语法通常是(?L),其中 L 是一个字母(或更多),例如 igm 等...文档 ...
          • @HamZa:确实,这似乎是一个错字。我认为本段试图描述非捕获组在开始时具有修饰符的可能性((?:(?is)...) 的一种快捷方式)。但是正确的语法是 (?is:...) 而不是 (?:is:...)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          相关资源
          最近更新 更多