【问题标题】:regex for removing curly brackets with nested curly brackets用于删除带有嵌套大括号的大括号的正则表达式
【发布时间】:2010-12-26 15:39:15
【问题描述】:

这是我的字符串:"This Is {{ dsfdf {{dsfsd}} ewrwrewr }} My Result"

我想删除外部大括号及其内容。 结果应该是"This Is My Result"

这是我目前最好的镜头:

Text = Regex.Replace(Text, "{{([^}]*)}}", String.Empty);

但效果不好。我得到"This Is ewrwrewr }} My Text"

或许应该用平衡匹配来解决……

如果有人能帮我解决这个问题,我会非常感激不尽,因为尽管我尝试了很多次,但我自己无法做到。

【问题讨论】:

  • “a{{b}}c}}”的结果应该是什么? - “ac}}”?、“a”还是错误?
  • 真的需要用正则表达式来解决吗?一个简单的迭代解决方案可能会更快、更容易编写和维护。

标签: c# regex


【解决方案1】:

一种简单但缓慢的方法是多次应用正则表达式,直到不再有更改:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string s = "This Is {{ dsfdf {{dsfsd}} ewrwrewr }} My Result";

        Regex regex = new Regex("{{({?}?[^{}])*}}");
        int length;
        do
        {
            length = s.Length;
            s = regex.Replace(s, "");
        } while (s.Length != length);

        Console.WriteLine(s);
     }
}

【讨论】:

  • 这个很好用!谢谢你的快速回答......我不知道这里有什么天才:))
【解决方案2】:

你怎么看:

string test = "This Is {{ dsfdf {{dsfsd}} \n jkhhjk ewrwrewr }} My Result";
Console.WriteLine(Regex.Replace(test, "{{.*}}", String.Empty, RegexOptions.Singleline));

没有“正则表达式”的版本:

string test = "This Is {{ dsfdf {{dsfsd}} \n jkhhjk ewrwrewr }} My Result";
int startIndex = test.IndexOf("{");
int length = test.LastIndexOf("}") - startIndex + 1;
Console.WriteLine(test.Replace(test.Substring(startIndex, length), String.Empty));

【讨论】:

  • 如果你的真实案例和你的例子一样简单,这应该没问题!
  • 这不会也删除括号组中的内容吗? {{ 1 {{ 2 }} 3 }} 4 {{ 5 }}
  • 感谢您的快速回复...!有用!但是......我之前没有提到它......我的错误。它有多行。一个更好的例子是:“这是 {{ dsfdf {{dsfsd}} \n jkhhjk ewrwrewr }} 我的结果”
  • @Tom:您可以再添加一个参数以使其与新行一起使用:“RegexOptions.Singleline”。
  • Glenn:Tom 举了一个例子,我给出了最简单的解决方案(就我而言)。我的解决方案不能处理所有可能的情况;)。
猜你喜欢
  • 2020-02-14
  • 2018-08-25
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多