让我们从小例子开始;我有以下文字:
[[some tag [[with tag nested]] and again]]
我想匹配 [[与标签嵌套]] ,但不匹配 [[some tag [[with tag nested]] 。简单
\[\[(?<content>.+?)\]\]
显然没有用。所以我创建了regexp:
\[\[(?!.*?\[\[.*?\]\].*?)(?<content>.+?)\]\]
不幸的是,它与使用C#(使用MatchOptions.SingleLine)的任何内容都不匹配,而PHP的preg_match完美运行。
任何线索/想法?任何帮助将不胜感激。
答案 0 :(得分:3)
这是一个有效的匹配吗?
[[ with [ single ] brackets ]]
如果没有,这个正则表达式应该这样做:
\[\[(?<content>[^][]*)\]\]
[^][]
匹配任何不是[
或]
的字符。如果允许单个大括号 ,请尝试:
\[\[(?<content>(?:(?!\[\[|\]\]).)*)\]\]
(?!\[\[|\]\]).
匹配任何字符,但只有在确定它不是[[
或]]
序列的开头之后才会匹配。
答案 1 :(得分:3)
我知道找到最里面的括号之一的最简单方法是:
var match = Regex.Match(input, @"^.*(\[\[(.*?)\]\])", RegexOptions.Singleline);
这是有效的,因为它找到 last [[
(因此后面不再有[[
,因此它不能包含任何嵌套标签)然后立即关注]]
。当然,这假设是良好的形式;如果你有一个字符串,其中开始/结束括号没有正确匹配,这可能会失败。
找到最里面的括号后,可以将其从输入字符串中删除:
input = input.Remove(match.Groups[1].Index, match.Groups[1].Length);
然后在while循环中重复该过程,直到正则表达式不再匹配。