我有一个字符串,我想在其中包括冒号,直到(不包括)空格或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]
答案 0 :(得分:2)
将您的条件“后跟空格或paren”作为lookahead,以便它看到但不匹配。现在,您明确地将括号与[\(\)\s]
明确匹配:
:(.+?)(?=[\s\(\)])
https://regex101.com/r/im8KWF/1/
或者,使用内置的\b
“word boundary”,这也是一个“零宽度”断言,意思相同*:
:(.+?)\b
https://regex101.com/r/FnnzGM/3/
*来自regular-expressions.info的词边界的定义:
有三种不同的职位符合词边界:
在字符串中的第一个字符之前,如果第一个字符是a 字符。在字符串中的最后一个字符后,如果是最后一个字符 character是一个单词字符。在字符串中的两个字符之间, 其中一个是单词字符而另一个不是单词字符。