如何匹配以$开头的变量和正则表达式?

时间:2016-04-22 15:03:10

标签: regex match

案例如下:

我有这个字符串变体:

['var1' => $var1, 'var2' => $obj->var1['asd']]
[ 'var1' => $var1, 'var2' => $obj->var1 ]
['var1' => $var1, 'var2' => $var2]

我需要匹配$var$obj->var1['asd']$obj->var1

我走得那么远:

(\$[^,\s\]]+]?)

它几乎可以工作,但最后一个案例仍然没有。在此处查看此操作:regex101.com/r/cI0yP0/3

更新

感谢您的所有答案。他们都完美无缺。

现在正如Joe指出的那样,可能还有其他一些情况如下。

['var' => $obj->var1->var2[2]->var3['test']->var4]
['var1' => $obj->var1[$obj2->var1['one']]]
['var2' => $obj[3]['var']]
['var3' => $obj->method()]

5 个答案:

答案 0 :(得分:3)

你带来了很好的正则表达式练习。您可以在下面找到3种不同的正则表达式来解决您的问题。

多个组的交替

不确定您是否喜欢使用这样的正则表达式:

flush

<强> Working demo

Regular expression visualization

具有交替的单组

但是,已经改进了以上正则表达式并且可以提出这个:

(\$.*?),|(\$.*?\])\]|(\$.*?)\]

Regular expression visualization

<强> Working demo

具有字符类

的单个组

添加一个字符类以获得更好的性能。我认为这是最好的。

(\$.*?\]?)(?:,|\])

Regular expression visualization

<强> Working demo

答案 1 :(得分:2)

这将允许您捕获链接在一起的任意数量的变量,并且不包括尾随方括号:

 \$(?:(?:(?<!\$)->)?(?:[a-zA-Z]\w*(?:\[[^\[\]]+\])*)(?:\(\))?)+

例如,这将捕获$obj->var1->var2[2]->method1()->var3['test']['test2']->method2()

Demo

这不支持嵌套括号。即$obj->var1[$obj2->var1['one']]要平衡括号,您需要使用正确的解析器

答案 2 :(得分:1)

(\$[\w]+(?:->[\w]+)?(?:\[.*?\])?)

<强>样本

https://regex101.com/r/cI0yP0/6

答案 3 :(得分:0)

您最后可以使用此正则表达式与[...]部分

进行可选匹配
\$[^][,\s]+(?:\[[^]]*\])?

RegEx Demo

答案 4 :(得分:0)

尝试以下正则表达式:

\$.+?(?=,|\s|\])(?:\](?=\]))?

请参阅DEMO

根据您的示例输入,它将捕获:

$var1
$obj->var1['asd']
$var1
$obj->var1
$var1
$var2