正则表达式Tag-Within-Tag

KCh*_*oux 0 ruby regex

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

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

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

<tag>[some characters <tag>[in here] to match]
Run Code Online (Sandbox Code Playgroud)

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

/<tag>\[(.*?(?:<tag>\[.*?\])*?.*?)\]/
Run Code Online (Sandbox Code Playgroud)

哪个不太合适.我希望它能匹配任意数量的字符,以及任何内部标记(如果它们存在).然而,它仍然有第一个结束括号的麻烦.

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

Gab*_*aru 6

虽然如果迷你语言变得更复杂,你可能应该删除正则表达式并手动执行此操作,但您可以使用递归正则表达式.

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

/(?<reg>(\w+\[([^\]\[]|\g<reg>)*\]))/
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到它: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
 )
)
Run Code Online (Sandbox Code Playgroud)