让我们从一个小例子开始;我有以下文字:
[[ some tag [[ with tag nested ]] and again ]]
我想匹配 [[ 带有嵌套标签 ]] 但不是 [[ 某些标签 [[ 带有嵌套标签 ]] 。简单
\[\[(?<content>.+?)\]\]
显然没用。所以我创建了正则表达式:
\[\[(?!.*?\[\[.*?\]\].*?)(?<content>.+?)\]\]
不幸的是,它不匹配使用 C#(使用 MatchOptions.SingleLine)的任何内容,而 PHP 的 preg_match 可以完美工作。
有任何线索/想法吗?任何帮助将不胜感激。
最佳答案
据我所知,查找最里面的括号之一的最简单方法是:
var match = Regex.Match(input, @"^.*(\[\[(.*?)\]\])", RegexOptions.Singleline);
这是有效的,因为它找到了最后 [[
(因此后面没有更多的[[
,所以它不能包含任何嵌套标签),然后是紧随其后的 ]]
。当然,这是假设格式良好的;如果字符串的开始/结束括号不正确匹配,则可能会失败。
找到最里面的括号后,您可以将其从输入字符串中删除:
input = input.Remove(match.Groups[1].Index, match.Groups[1].Length);
然后在 while 循环中重复该过程,直到正则表达式不再匹配。
关于C# 嵌套标签的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754304/