嵌套模式的正则表达式

能够

我有这样的文字:

((#) This is text

    ((#) This is subtext 

        ((#) This is sub-subtext #)

    #)

 #)

我做了以下正则表达式:

        var counter = 0;
        return Regex.Replace(text,
             @"\(\(#\)(.*?)#\)",
             m =>
             {
                var str = m.ToString();
                counter++;
                return counter + ") " + str.Replace("((#)", "").Replace("#)", "")
             });

所以我期望的结果是

1) This is text
   2) This is subtext
       3) This is sub-subtext

我知道这将无法正常工作,因为正则表达式将从第二个((#)中获取#),依此类推。

如何避免这种冲突?谢谢!:)

维克多·史翠比维

这是我建议的解决方案:

  • 使用具有平衡组的正则表达式获取嵌套字符串,
  • 在循环中替换子字符串。

在此处查看regex演示它匹配空字符串,但也捕获所有以开头((#)和结尾的嵌套子字符串#)

这是C#演示代码:

var text = @"((#) This is text

    ((#) This is subtext 

        ((#) This is sub-subtext #)

     #)

#)";
var chunks = Regex.Matches(text,
            @"(?s)(?=(\(\(#\)(?>(?!\(\(#\)|#\)).|\(\(#\)(?<D>)|#\)(?<-D>))*(?(D)(?!))#\)))")
               .Cast<Match>().Select(p => p.Groups[1].Value)
               .ToList();
for (var i = 0; i < chunks.Count; i++)
     text = text.Replace(chunks[i], string.Format("{0}) {1}", (i+1), 
                         chunks[i].Substring(4, chunks[i].Length-6).Trim()));

请注意,.Substring(4, chunks[i].Length-6)只是从((#)获取子字符串#)由于我们知道定界符,因此可以对这些值进行硬编码。

输出:

在此处输入图片说明

若要了解有关平衡组的更多信息,请参见平衡组定义.NET Regex平衡组的乐趣

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章