正则表达式组不按预期工作

时间:2014-07-24 16:30:30

标签: regex

较新版本的php允许您使用类似javascript的数组语法声明数组,如下所示:

$arr = [$var1, $var2];

出于兼容性原因,我想将其转换为较旧的php样式数组语法,即

$arr = array($var1, $var2);

所以我做了一个正则表达式,找到方括号之间的任何表达式,在它后面有0或1个空格的等号,它有效,它看起来像这样:

\=(\s){0,1}\[(.*?)+\]

并用array分隔符替换方括号,所以

[ //stuff ]变成了 array( //stuff)

因此,使用表达式组,我认为$0将是整个正则表达式,$1将是(\s){0,1},而$0将是(.*?)+ },所以用这个替换

array\( $2 \)应该做到这一点 除了1美元和2美元都是空字符串,所以我不确定我在这里缺少什么。我在Netbeans和Notepad ++中尝试过相同的结果。

1 个答案:

答案 0 :(得分:2)

您的问题是捕获括号后的+量词。如果你删除它,一切都应该工作。量化捕获组几乎绝不是一个好主意(如果你这样做,RegexBuddy会严厉警告你。)

=(\s?)\[(.*?)\]

<强>解释

(.*?)匹配任意长度的字符串,最好是空字符串。如果您拥有正则表达式\[(.*?)\]并将其应用于[a],则该组将按预期与a匹配。

但是看看如果你使用正则表达式\[(.*?)+\]会发生什么:

  • \[匹配[
  • (.*?)匹配a之前的空字符串并将其捕获。
  • +要求尽可能多地重复一次,所以让我们做一次:
  • (.*?)a匹配并捕获它,覆盖之前匹配的""
  • 让我们再做一次重复!
  • (.*?)匹配]之前的空字符串并捕获它,覆盖之前匹配的"a"
  • (.*?)]匹配并捕获它,覆盖之前匹配的""
  • 哎呀,字符串结束了,我们还没有匹配\]。备份。
  • (.*?)匹配]之前的空字符串并捕获它,覆盖之前匹配的"]"
  • \]匹配]。万岁!

组1现在包含空字符串,组0(或JavaScript中的$&)包含[a]