正则表达式Tag-Within-Tag

时间:2012-03-18 08:00:38

标签: ruby regex

我有一个相当简单的正则表达式问题,我还没有想到一个小小的个人实验。

在字符串中,我可能需要匹配几个<tag>[some characters here]。显而易见的方法是使用/<tag>\[.*?\]/正则表达式匹配<tag>[之后和]之前的任何字符。

但是,我希望能够在<tag> s内拥有<tag> s。这会导致问题。如果我有以下内容:

<tag>[some characters <tag>[in here] to match]

正则表达式会在到达第一个结束括号时立即停止匹配,并且完全无法匹配语句的最后部分。我试图通过告诉正则表达式忽略任何内部<tag>来解决问题,所以我可以稍后对剥离的内容进行匹配。我还没有完全开始工作。我最接近的是:

/<tag>\[(.*?(?:<tag>\[.*?\])*?.*?)\]/

哪个不太合适。我希望它能匹配任意数量的字符,以及任何内部标记(如果它们存在)。但是,第一个结束时仍然存在问题。

也许那些在正则表达式上表现更好的人知道一个很好的解决方案。

1 个答案:

答案 0 :(得分:6)

虽然你应该放弃正则表达式并且如果迷你语言变得更复杂,手动执行此操作,你可以使用递归正则表达式。

你的正则表达式看起来像这样:

/(?<reg>(\w+\[([^\]\[]|\g<reg>)*\]))/

您可以在此处看到它:http://rubular.com/r/9F7isgZpj9

这是正则表达式细分到其各个部分:

(?<reg>(    # start a regex named "reg"
  \w+       # the tag name
  \[        # open bracket
  (         # which can contain
    [^\]\[] # non-bracket characters
    |       # or
    \g<reg> # sub-tags (this is where the magic happens)
  )*        # zero or more times
  \]        # close the tag
 )
)