如何删除多对括号之间的文本?

Joh*_*eld 7 c# regex

我想删除多对括号中的每对之间包含的文本。如果字符串中只有一对括号,则下面的代码可以正常工作:

var text = "This (remove me) works fine!";

// Remove text between brackets.
text = Regex.Replace(text, @"\(.*\)", "");

// Remove extra spaces.
text = Regex.Replace(text, @"\s+", " ");

Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)

这工作正常!

但是,如果字符串中包含多组括号,则会删除过多的文本。Regex 表达式删除 FIRST 左括号和 LAST 右括号之间的所有文本。

var text = "This is (remove me) not (remove me) a problem!";

// Remove text between brackets.
text = Regex.Replace(text, @"\(.*\)", "");

// Remove extra spaces.
text = Regex.Replace(text, @"\s+", " ");

Console.WriteLine(text);
Run Code Online (Sandbox Code Playgroud)

这是个问题!

我很难过 - 我确定有一个简单的解决方案,但我没有想法......

帮助最受欢迎!

Dmi*_*nko 11

You have two main possibilities:

  • change .* to .*? i.e. match as few as possible and thus match ) as early as possible:

    text = Regex.Replace(text, @"\(.*?\)", "");
    text = Regex.Replace(text, @"\s{2,}", " "); // let's exclude trivial replaces 
    
    Run Code Online (Sandbox Code Playgroud)
  • change .* to [^)]* i.e. match any symbols except ):

    text = Regex.Replace(text, @"\([^)]*\)", "");
    text = Regex.Replace(text, @"\s{2,}", " ");
    
    Run Code Online (Sandbox Code Playgroud)