【问题标题】:Parse for square brackets with regular expressions使用正则表达式解析方括号
【发布时间】:2011-09-05 23:43:06
【问题描述】:

我一直很难使用正则表达式。我已经搜索过这方面的帮助,但我找不到我要找的东西。

我有遵循这种模式的文本块:

[php] ...任何类型的代码示例在这里 [/php]

我需要:

  • 检查方括号,它可以包含任意数量的 20-30 个编程语言名称(phpruby 等)。
  • 需要抓取左括号和右括号之间的所有代码。

我已经制定了以下正则表达式:

#\[([a-z]+)\]([^\[/]*)\[/([a-z]+)\]#i

这一切都很好。但是,当代码示例包含方括号时,它会中断。如何修改它,以便这些左/右大括号之间的 任何 字符将被匹配以供以后使用?

【问题讨论】:

  • 你会有类似[php] print "[/php]"; [/php]的东西吗?如果是这样,正则表达式不会帮助你,但会帮助你很多。检测类似情况所需的正则表达式会非常复杂,因此最好使用整个解析器。

标签: php regex debugging


【解决方案1】:

这是您想要的正则表达式。它也匹配标签所在的位置,因此php 标签只会结束php 标签。

/\[(\w+)\](.*?)\[\/\1\]/s

或者,如果您想明确匹配您可以使用的标签...

$langs = array('php', 'python', ...); 

$langs = implode('|', array_map('preg_quote', $langs));

preg_match_all('/\[(' . $langs . ')\](.*?)\[\/\1\]/s', $str, $matches);

【讨论】:

  • 这也捕获了.*? 部分,这会破坏反向引用。
  • @Refactor 如何破坏反向引用?
  • 你在\1之前缺少一个/
【解决方案2】:

以下将起作用:

\[([a-z]+)\].*\[/\1\]

如果你不想消除贪心,你可以这样做:

\[([a-z]+)\].*?\[/\1\]

您所要做的就是检查结束标签和开始标签是否具有相同的文本(在这种情况下,它们是相同的编程语言),然后使用 \1 进行检查,告诉它匹配之前匹配的组号 1:([a-z]+)

【讨论】:

    【解决方案3】:

    你为什么不使用下面的东西:

    \[php\].*?\[/php\]
    

    我不明白您为什么要使用 [a-z]+ 作为标签,应该有 php 或数量有限的其他标签。保持简单。

    其实你可以用:

    \[(php)\].*?\[/(\1)\]
    

    这样您就可以匹配开始和结束标签。否则,您将匹配随机打开和关闭。添加其他喜欢,我不知道,js 等为php|js 等。

    【讨论】:

      【解决方案4】:

      使用反向引用来引用正则表达式中已经进行的匹配:

      \[(\w+)\].*?\[/\1\]
      

      【讨论】:

        猜你喜欢
        • 2014-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多