如何用PCRE兼容的grep正则匹配foo()函数的所有单引号字符串参数?
用grep(PCRE)匹配foo()函数的所有单引号字符串参数
问题说明
需要提取所有传递给foo()函数的单引号字符串参数,现有正则仅能匹配每个函数调用中的最后一个参数,需修改为可匹配全部目标内容的PCRE正则。
解决方案
使用带PCRE支持的grep命令,搭配以下正则表达式:
grep -P -o "(?<=(?:foo\(|,)\s*')([^']*)(?='\s*(?:,|\)))" 目标文件名
正则解析
(?<=(?:foo\(|,)\s*'):正向后顾断言,确保当前匹配的内容前是foo(起始或者参数分隔符逗号,且后续跟着任意空格和单引号([^']*):捕获单引号内的所有非单引号字符,即我们需要的参数内容(?='\s*(?:,|\))):正向前瞻断言,确保当前匹配的内容后是单引号,跟着任意空格,然后是参数分隔符逗号或函数结束的右括号
示例验证
对以下调用的匹配结果符合预期:
foo('Alice')→ 输出:Alicefoo('Alice', 'Bob', 'Charlie')→ 输出三行:Alice、Bob、Charliefoo(flag ? 'Alice' : 'Bob')→ 输出两行:Alice、Bob
原正则问题分析
原正则foo\([^\)]*\K(?:')([^'\)]*)(?:'\))中,[^\)]*是贪婪匹配,会直接匹配到foo()内接近右括号的位置,导致仅能捕获最后一个单引号字符串,无法覆盖所有参数。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

