正则表达式捕获包括太多

时间:2018-01-23 15:22:11

标签: java regex

我有一个字符串,我想在其中包括冒号,直到(不包括)空格或paranthesis。

为什么以下正则表达式包含字符串匹配中的paranthesis? :(.*?)[\(\)\s]:(.+?)[\)\s](非贪婪)不起作用。

示例输入:WHERE t.operator_id = :operatorID AND (t.merchant_id = :merchantID) AND t.readerApplication_id = :readerApplicationID AND t.accountType in :accountTypes

应该提取:operatorID:merchantID:readerApplicationID:accountTypes。 但我的正则表达式提取第二场比赛:marchantID) 有什么不对,为什么?

即使我在捕获中使用了exacter映射条件,它也不起作用:
:([a-zA-z0-9_]+?)[\)\(\s]

1 个答案:

答案 0 :(得分:2)

将您的条件“后跟空格或paren”作为lookahead,以便它看到但不匹配。现在,您明确地将括号与[\(\)\s]明确匹配:

:(.+?)(?=[\s\(\)])

https://regex101.com/r/im8KWF/1/

或者,使用内置的\bword boundary”,这也是一个“零宽度”断言,意思相同*:

:(.+?)\b

https://regex101.com/r/FnnzGM/3/

*来自regular-expressions.info的词边界的定义:

  

有三种不同的职位符合词边界:

     

在字符串中的第一个字符之前,如果第一个字符是a   字符。在字符串中的最后一个字符后,如果是最后一个字符   character是一个单词字符。在字符串中的两个字符之间,   其中一个是单词字符而另一个不是单词字符。