使用正则表达式查找所有方括号中的文本

3

因为PHP版本的问题,我需要将我的代码从$array[stringindex]更改为$array['stringindex'];

所以我想要使用正则表达式来查找所有文本,并进行替换。如何查找所有类似于$array[stringindex]的字符串?

3个回答

2
这是 PHP 的解决方案:
$re = "/(\\$[[:alpha:]][[:alnum:]]+\\[)([[:alpha:]][[:alnum:]]+)(\\])/"; 
$str = "here is \$array[stringindex] but not \$array['stringindex'] nor \$3array[stringindex] nor \$array[4stringindex]"; 
$subst = "$1'$2'$3"; 

$result = preg_replace($re, $subst, $str);

您可以在此交互式地尝试它。我搜索以字母开头的变量,否则像$foo[42]这样的内容将被转换为$foo['42'],这可能不是理想的。

请注意,这里的所有解决方案都无法正确处理每种情况。

查看Sublime Text正则表达式帮助后,似乎只需将(\\$[[:alpha:]][[:alnum:]]+\\[)([[:alpha:]][[:alnum:]]+)(\\])粘贴到搜索框中,然后将$1'$2'$3粘贴到替换字段中即可。


1

这取决于您想要使用的工具来进行替换。例如,使用sed,它可能是这样的:

sed "s/\(\$array\)\[\([^]]*\)\]/\1['\2']/g"

我现在正在使用Sublime Text,那会是一样的吗? - Agung Kessawa
看起来像是Java正则表达式格式:regex= ($array)[([^]]*)],replacement = $1['$2'] - Dédé Lolo
Sublime Text使用boost库(Pearl语法)。请参见[链接](http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html) - Dédé Lolo

1
如果允许使用 ,你可以简单地执行以下操作:

sed -i "s/(\$[^[]*[)([^]]*)]/\1'\2']/g" file

解释:

  • sed "s/pattern/replace/g" 是一个 sed 命令,它搜索 pattern 并将其替换为 replace。选项 g 表示每行替换多次。
  • (\$[^[]*[)([^]]*)] 这个模式由两个组成(括号之间)。第一个是一个美元符号,后跟一系列非 [ 字符。然后是一个开放的方括号,后跟一系列非闭合方括号,然后是一个闭合方括号。
  • \1'\2'] 替换字符串:\1 意味着插入第一个捕获组(对于 \2 类似)。基本上我们用引号包裹了 \2(这就是你想要的)。
  • 选项 -i 表示更改应应用于提供的原始文件。

有关更多信息,请参见 man sed

这可以与 命令结合使用,如下所示:

find . -name '*.php' -exec sed -i "s/(\$[^[]*[)([^]]*)]/\1'\2']/g" '{}' \;

这将对所有找到的php文件应用sed命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接