【问题标题】:How to match variables starting with $ with regex?如何匹配以 $ 开头的变量和正则表达式?
【发布时间】:2016-04-22 15:03:09
【问题描述】:

案例如下:

我有这个字符串变体:

['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

更新:

感谢您的所有回答。它们都工作得很好。

现在正如乔指出的那样,可能还有其他情况,例如以下。

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

【问题讨论】:

  • @Aley:您的演示显示 $obj->var1 匹配
  • @anubhava $var2] 是问题所在。查看最后一个字符。
  • 好的,你用的是什么正则表达式?
  • 我这里用的是PHP,所以是PCRE

标签: regex match


【解决方案1】:

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

多组交替

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

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

Working demo


单组交替

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

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

Working demo


具有字符类的单个组

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

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

Working demo

【讨论】:

  • 谢谢Federico,你的解释很详细。非常喜欢!
  • 嗨@Aley 很高兴为您提供帮助!
【解决方案2】:

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

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

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

Demo

这不支持嵌套括号。即$obj-&gt;var1[$obj2-&gt;var1['one']] 要平衡括号,您需要使用适当的解析器

【讨论】:

  • 谢谢乔,我忘记了其他情况,但现在意识到它们也可能发生。嵌套括号和 $obj[3]['var']$obj-&gt;method(); 之类的东西很容易捕捉。
  • 我更新为支持多个括号和方法调用。你真的应该根据你想要做什么来考虑一个解析器,因为它仍然可以拾取无效的语法,比如$x[t'es't]y
  • 谢谢乔!我们有一个 gettext 包装器,它采用您在问题中找到的示例等参数。现在必须将它们提取出来。我不确定是否有一个解析器正在这样做。
【解决方案3】:
(\$[\w]+(?:->[\w]+)?(?:\[.*?\])?)

演示

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

【讨论】:

    【解决方案4】:

    您可以将此正则表达式与[...] 部分最后的可选匹配一起使用:

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

    RegEx Demo

    【讨论】:

      【解决方案5】:

      尝试以下正则表达式:

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

      DEMO

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 2013-11-23
        • 2015-07-06
        • 2015-04-27
        • 1970-01-01
        • 2018-12-15
        • 2014-08-15
        相关资源
        最近更新 更多