You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式仅匹配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及更早版本)

分两步处理:

  1. 先提取所有foo函数的完整参数字符串:\bfoo\(([^()]*)\)
  2. 再从参数字符串中匹配所有单引号包裹的内容:'([^']+)'

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:02