【问题标题】:How to remove possibly nested brackets using RegEx?如何使用 RegEx 删除可能嵌套的括号?
【发布时间】:2014-07-06 00:02:43
【问题描述】:

我有以下文字:

{{ some text {{ with nested text }} and again }} and some more text over here {{remove this too}}

我想匹配最外面的 {{ }} 括号,这样我就剩下:

这里还有一些文字

这是我目前所拥有的:

var text = Regex.Replace(content, "{{[^}}]*}}",string.Empty);

有什么想法吗?任何帮助将不胜感激。

更新添加一些可能有用的链接:

{{.+?}} http://www.regexr.com/3941i

{{.+}} http://www.regexr.com/3941f

【问题讨论】:

    标签: c# regex


    【解决方案1】:
    var text = Regex.Replace(content, "{{.+}}", string.Empty);
    

    编辑(平衡匹配)

    string content = @"{{ some text {{ with nested text }} and again }} and some more text over here {{remove this too}}";
    
    Regex re = new Regex(@" {{
        [^{}]*
        (
            (
                (?<Open>{{)
                [^{}]*
            )+
            (
                (?<Close-Open>}})
                [^{}]*
            )+
        )*
        (?(Open)(?!))
        }}", RegexOptions.IgnorePatternWhitespace);
    
    var text = re.Replace(content, string.Empty);
    

    更多详情:http://blogs.msdn.com/b/bclteam/archive/2005/03/15/396452.aspx

    【讨论】:

    • 这行得通,但它似乎有点作弊 - 我会稍微改变一下我的例子,这样你就可以明白我的意思了。
    • 这是递归正则表达式吗?是的。一个正则表达式的鼻屎。我不知道 C# 可以做到这一点。
    • &lt;Open&gt; 行下应该是这个吗? [^&lt;&gt;]* 还是这个? [^{}]*
    • 很好的答案,但“[^{}]*”有点令人困惑,因为它不是双 {{}}。我很困惑你将如何解决括号 {{ 替换为不相同的字符 12 和 }} 替换为 34 的示例?示例字符串:12TE12ST34ST34RING 产生 RING。我尝试使用负前瞻是否正确?
    【解决方案2】:

    你的正则表达式

    {{[^}}]*}}
    

    不起作用(try it),因为[^}}] 不允许它通过第一个*关闭卷曲。如果你想捕捉“除了最后两个之外的所有紧密卷曲”,那么你需要

    \{\{.*\}\}[ ]+
    

    Try it

    为了安全起见,我要避开卷发。尽管在 regexstorm 中没有它们也可以工作,但它们是特殊字符,应该被转义。我还添加了尾随空格,以便按您的意愿捕获后文。

    请注意,此正则表达式不会检查花饰是否平衡——它只是盲目地匹配前两个开放花饰到后两个。正则表达式不适合确定“平衡性”。

    (*第一个,因为[^}}]不正确。[^...]negative character class--它匹配任何 一个 字符 不在类中(方括号之间)。所以[^}}] 等价于[^}}}}}}}}}}}}}}}] 等价于[^}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}]。)


    请考虑将Stack Overflow Regular Expressions FAQ 加入书签以供将来参考。

    【讨论】:

    • 我更新了我的初始文本。我可能应该包含结果文本的前导空格,因为我不希望正则表达式查找它。所以你是说这不是正则表达式的好方法吗?你有什么推荐?
    • 我想我应该说简单正则表达式不利于平衡。
    【解决方案3】:

    我不认为你可以一次性完成,这在 php 中有效,捕获匹配的 { } 然后修剪外括号,重复

    (\{(?:[^\{\}]*+|(?0))*\})
    

    否则我会将字符串标记化,将其分解为 {{, }} 和文本并在 php 中处理结果( preg_match_all )

    (\{\{)|(\}\})|([^{}]+)
    

    并处理结果,

       Array
    (
        [0] => Array
            (
                [0] => {{
                [1] =>  some text 
                [2] => {{
                [3] =>  with nested text 
                [4] => }}
                [5] =>  and again 
                [6] => }}
            )
    
        [1] => Array
            (
                [0] => {{
                [1] => 
                [2] => {{
                [3] => 
                [4] => 
                [5] => 
                [6] => 
            )
    
        [2] => Array
            (
                [0] => 
                [1] => 
                [2] => 
                [3] => 
                [4] => }}
                [5] => 
                [6] => }}
            )
    
        [3] => Array
            (
                [0] => 
                [1] =>  some text 
                [2] => 
                [3] =>  with nested text 
                [4] => 
                [5] =>  and again 
                [6] => 
            )
    
    )
    

    喜欢 if(item == {{) ++嵌套;等等,如果你遵循逻辑。

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 2019-08-11
      • 2011-02-10
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多