【问题标题】:How to get content between the brackets using regex如何使用正则表达式获取括号之间的内容
【发布时间】:2013-05-02 05:28:50
【问题描述】:

我有一个这样的字符串:

[abc] 12345 [abc] 67890 [/abc] [/abc]

我想匹配括号内的内容,但如果找到另一个左括号(例如,[abc]),则不返回匹配项。函数/\[abc\](.*)\[\/abc\]/i 会输出:

12345 [abc] 67890 [/abc]

但这不是我想要的,因为文本内还有另一个左括号。预期的结果是:

67890

有什么解决方法的建议吗?

【问题讨论】:

  • 如果您需要在这样的语法中询问和解决复杂的问题,您可能需要一个完整的词法分析器(也称为标记器)和解析器系统,对于这个问题,正则表达式可以工作,但对于更难的问题它不会

标签: regex preg-match


【解决方案1】:

是的,只需声明您不想使用[^\[\]]* 而不是.*(这将匹配任何东西,包括括号)来允许标签之间使用括号:

/\[abc\]([^\[\]]*)\[\/abc\]/i

【讨论】:

  • +1 只是出于兴趣,如果我想阻止类似:[a][/b] 的事情怎么办。我是否必须写更多的表达式,或者有没有办法改变你写的那个,只允许:[a][/a]。等
  • @Touch:这已经被禁止了,因为标签之间根本不允许使用括号。当您想要允许 other 标签时,它会变得很有趣,例如。 G。允许[a] foo [b] bar [/b] baz [/a],但禁止[a] foo [a] bar [/a] baz [/a]。为此,您需要先行断言(或完全从正则表达式移到解析器世界)。
【解决方案2】:

试试这个模式:

\[[^\/\]]*\]([^\[]*)\[\/[^\]]*\]

\[ ---> 字符[

[^\/\]]* ---> 读取数据直到到达]/

\] ---> 字符]

[^\[]* ---> 读取数据直到到达字符[

() ---> 表示组,我们可以选择该组为\1

演示 http://rubular.com/r/shwsqTE61R

【讨论】:

    【解决方案3】:

    没什么新意,只是写得更短:

    $subject = '[abc] 12345 [abc] 67890 [/abc] [/abc]';
    $pattern = '~\[abc]\K[^[]++(?=\[/abc])~i';
    preg_match($pattern, $subject, $result);
    

    【讨论】:

      【解决方案4】:

      检查这个模式:

      (\d+)(?:\s*\[/abc\]\s*)+$
      

      它将从右侧查看并跳过所有结束标签,如[/abc],然后选择下一个数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 2011-09-06
        • 1970-01-01
        • 2020-06-03
        • 2011-04-12
        相关资源
        最近更新 更多