首页 > 解决方案 > 我需要使用 perl 从字符串中提取一些位于括号之间的值

问题描述

我有这个字符串,我需要在 $env 之后提取值并位于括号之间。

$env(test_$env(test1_$env(test2))) $env(test3)

我已经尝试过这样的事情,但它并没有像我预期的那样工作:

/\s*env\(([^)]+)\)/g

我期望数组中的以下输出:

test_$env(test1_$env(test2))
test1_$env(test2)
test2
test3

标签: regexperl

解决方案


您可以使用

/(?=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";
}

推荐阅读