带分隔符的正则表达式子字符串

时间:2018-11-20 06:55:36

标签: regex

我有以下文字(可以是无数的定界对):

zz=yy /* animal=cat,AA=bb, qqq=dd */ yyy=ttt

我想使用正则表达式在代码注释中获取所有分隔字符串的匹配项:

1. animal=cat
2. AA=bb
3. qqq=dd

但不是:zz = yy或yyy = ttt

更新: 我已经测试了建议的模式(一切都很好,我学到了很多东西,谢谢)。我继续进行实验,发现了以下模式:

(?:\/\*\s*|\G\s*,\s*)(?:(\w+)=(\w+)(?:\s*\*\/)?)

需要更少的步骤,也可以处理多行。您认为此解决方案有任何问题吗?

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

2 个答案:

答案 0 :(得分:2)

一个选项是

(\b\w+)=(\w+\b)(?=(?:(?!\/\*).)*\*\/)

用通俗易懂的语言,这意味着:在=对之后,先查找(不包含/*子字符串的字符),然后是*/

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

采用更少步骤的替代方法,而是从/*开始进行匹配:

(?:\/\*|\G(?!^))(?:(?!\*\/|\/\*).)*?(\b\w+)=(\w+\b)

https://regex101.com/r/Dvx99F/2

答案 1 :(得分:1)

如果您的引擎支持\G,则可以使用

(?:\G(?!\A)|/\*)
(?:(?:(?!\*/)[\s\S])+?)
(?P<key>\w+)=(?P<value>\w+)

请参见a demo on regex101.com


解释:

(?:\G(?!\A)|/\*)             # match /* or at the end of the last match
(?:(?:(?!\*/)[\s\S])+?)      # fast-forward
(?P<key>\w+)=(?P<value>\w+)  # key/value pair