我有一个相当简单的正则表达式问题,我还没有想到一个小小的个人实验。
在字符串中,我可能需要匹配几个<tag>[some characters here]
。显而易见的方法是使用/<tag>\[.*?\]/
正则表达式匹配<tag>[
之后和]
之前的任何字符。
但是,我希望能够在<tag>
s内拥有<tag>
s。这会导致问题。如果我有以下内容:
<tag>[some characters <tag>[in here] to match]
正则表达式会在到达第一个结束括号时立即停止匹配,并且完全无法匹配语句的最后部分。我试图通过告诉正则表达式忽略任何内部<tag>
来解决问题,所以我可以稍后对剥离的内容进行匹配。我还没有完全开始工作。我最接近的是:
/<tag>\[(.*?(?:<tag>\[.*?\])*?.*?)\]/
哪个不太合适。我希望它能匹配任意数量的字符,以及任何内部标记(如果它们存在)。但是,第一个结束时仍然存在问题。
也许那些在正则表达式上表现更好的人知道一个很好的解决方案。
答案 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
)
)