【问题标题】:How to Match a String Against Multiple Regex Patterns in Java如何在 Java 中将字符串与多个正则表达式模式匹配
【发布时间】:2017-01-07 03:42:42
【问题描述】:

我了解如何使用管道符号将单个字符串与多个正则表达式模式匹配,如该问题的一些答案中所述:Match a string against multiple regex patterns

我的问题是,当我有以下字符串时:

this_isAnExample of What nav-input a-autoid-9-announce thisIsAnExampleToo

我使用以下正则表达式来提取文本:

[A-Z][a-z]*|(?<=_)[A-Za-z-]*

我希望得到以下匹配项:

is
An
Example
What
Is
An
Example
Too

但我实际上得到的是:

isAnExample
What
Is
An
Example
Too

基本上,引擎会自动将单词 An 与 Example 链接起来,因为它与下划线模式匹配,但我希望它把它们视为两个单词(非贪婪?),因为根据另一种模式,还有另一个匹配项。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    你可能把正则表达式改成

    [A-Z][a-z]*|(?<=_)[a-z-]*
    

    第一部分是以大写字母开头的小写单词,或者第二部分:小写单词前面有下划线。

    您发布的正则表达式(?&lt;=_)[A-Za-z-]*的部分匹配下划线后的大小写字母,即遇到大写字母时不会停止匹配,实际上应该是另一个单词的开头。

    【讨论】:

    • 仅供参考。如果输入只是_,它将找到一个空字符串的匹配项。
    • @anubhava 你是对的。遗憾的是,OP 没有描述应该匹配什么,他只举了一个例子......要仅匹配非空字符串,请在正则表达式中将 * 替换为 +
    【解决方案2】:

    您可以使用此替代正则表达式来捕获前面带有 _ 或混合大小写文本的所有小写文本:

    ((?<=_)[a-z][a-z-]*|[A-Z][a-z]*)
    

    RegEx Demo

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2021-12-08
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多