regex - 我需要使用 perl 从字符串中提取一些位于括号之间的值
问题描述
我有这个字符串,我需要在 $env 之后提取值并位于括号之间。
$env(test_$env(test1_$env(test2))) $env(test3)
我已经尝试过这样的事情,但它并没有像我预期的那样工作:
/\s*env\(([^)]+)\)/g
我期望数组中的以下输出:
test_$env(test1_$env(test2))
test1_$env(test2)
test2
test3
解决方案
您可以使用
/(?=env(\(((?:[^()]++|(?1))*)\)))/g
请参阅正则表达式演示。
细节
(?=
- 开始积极的前瞻以允许重叠匹配env
- 文字env
文本(\(((?:[^()]++|(?1))*)\))
- 第 1 组,需要递归括号内的子字符串env(...)
,匹配\(
- 一个(
字符((?:[^()]++|(?1))*)
- 第 2 组(保存要提取的值):0 个或多个序列(*
),由 1+ 个字符组成,除了(
和)
([^()]++
)或整个第 1 组模式((?1)
)\)
- 一个)
)
- 前瞻结束
查看在线代码演示:
$string = '$env(test_$env(test1_$env(test2))) $env(test3)';
while($string =~ /(?=env(\(((?:[^()]++|(?1))*)\)))/g) {
print "$2\n";
}
推荐阅读
- c++ - 是否有等效于 slmgr.vbs /skms 的 C++/Winapi
- postgresql - 从 postgresql 中的日/月中提取年份并检查日期是否为一年中的第一个和/或最后一个
- python - 从 Python 文件构建 EXE 文件(不是同一个普通问题 - 请参阅)
- ios - 动态物理体最终被推离屏幕
- asp.net-mvc - 获取多组单选按钮asp.net mvc 5的选定值
- swiper - Swiper JS,如何在自由模式下停止 swiper 包装?
- html - CSS下拉菜单只显示一个没有链接的小矩形,为什么它不起作用?
- powershell - 如何设置 Azure AD 注册应用的 API Key 的“密钥描述”
- php - 使用 PHP 将 HTML 表单转换为数据库
- python - 如何解释 cron.yaml 文件中的 URL 参数?