如何编写正则表达式仅匹配foo()函数内单引号包裹的目标文本
提取foo()函数内单引号包裹内容的正则方案
适用支持可变长度后顾断言的引擎(Python、.NET等)
直接使用单条正则提取,结果直接保存在捕获组1中:
(?<=\bfoo\([^()]*?)'([^']+)'(?=[^()]*\))
规则说明:
\bfoo\(匹配foo函数调用的起始位置,\b避免匹配到后缀带foo的其他函数(例如xfoo())- 前向后顾断言
(?<=\bfoo\([^()]*?)确认当前单引号位于foo(之后,且中间没有其他括号,保证处于foo函数的参数区间内 '([^']+)'匹配单引号包裹的内容,捕获组1即为需要提取的文本- 前向断言
(?=[^()]*\))确认当前单引号之后没有其他括号,最终指向foo函数的闭合右括号,避免匹配到函数外的单引号
Python使用示例:
import re test_content = """ foo('text1', 'text2', 'text3') bar('不提取1', '不提取2') '不提取3' foo('a1', 'a2', 'a3') """ res = re.findall(r"(?<=\bfoo\([^()]*?)'([^']+)'(?=[^()]*\))", test_content) print(res) # 输出:['text1', 'text2', 'text3', 'a1', 'a2', 'a3']
适用不支持可变长度后顾断言的引擎(JavaScript、Java 8及更早版本)
分两步处理:
- 先提取所有foo函数的完整参数字符串:
\bfoo\(([^()]*)\) - 再从参数字符串中匹配所有单引号包裹的内容:
'([^']+)'
JavaScript使用示例:
const testContent = ` foo('text1', 'text2', 'text3') bar('不提取1', '不提取2') '不提取3' ` const result = [] // 第一步匹配foo函数的参数部分 const fooMatch = testContent.match(/\bfoo\(([^()]*)\)/) if (fooMatch) { // 第二步匹配参数里的单引号内容 const quoteMatches = fooMatch[1].match(/'([^']+)'/g) quoteMatches?.forEach(item => result.push(item.replaceAll("'", ""))) } console.log(result) // 输出:['text1', 'text2', 'text3']
特殊场景适配
- 如果单引号内部存在转义单引号(例如
foo('it\'s ok')),将匹配单引号内容的部分替换为'([^'\\]*(?:\\.[^'\\]*)*)'即可支持转义场景 - 如果foo参数内存在多层嵌套括号(例如传入其他函数作为参数),建议使用对应语言的语法解析器处理,正则仅适合处理无嵌套或浅层嵌套的场景
内容的提问来源于stack exchange,提问作者nicwhitts
相关产品推荐
相关产品推荐

