删除两个字符之间的所有内容,只要它们不在其他字符内

时间:2011-06-05 23:02:35

标签: c# .net regex

基本上,我的目标是删除()中的所有内容,除了“”里面的字符串。

我在这里关注代码:Remove text in-between delimiters in a string (using a regex?)

这很有效;但如果它们在“”中,我还有另外要求不删除()的。这是可以通过正则表达式完成的事情。我觉得我很危险地接近需要另一种方法,比如真正的解析器。

这就是我一直在使用的......

string RemoveBetween(string s, char begin, char end)
{
    Regex regex = new Regex(string.Format("\\{0}.*?\\{1}", begin, end));
    return regex.Replace(s, string.Empty);
}

3 个答案:

答案 0 :(得分:3)

我不会说C,但这是java实现:

input.replaceAll("(?<=\\().*?(?=[\"()])(\"([^\"]*)\")?.*(?=\\))", "$2");

这会产生以下结果:

"foo (bar \"hello world\" foo) bar" --> "foo (hello world) bar"
"foo (bar foo) bar" --> "foo () bar"

目前尚不清楚您是否要保留报价 - 如果您这样做,请使用$ 1而不是$ 2

现在你已经有了正则表达式了,你应该能够在C中使它适用于你。

答案 1 :(得分:3)

.NET正则表达式比平时更强大,你可以肯定做你想要的。看看这个,它寻找平衡的括号,这与你的问题基本上是相同的,但是括号而不是引号。

http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx

答案 2 :(得分:2)

在这个论坛上说“不,你不能”是冒险的,因为有人会通过提供一个有效的答案来破坏它。 : - )

但我会说这会真正拉伸正则表达式,而你的问题优雅地适用于Automata-based programming

就个人而言,我更乐意维护一个20行有限状态机,然后是一个10个字符的正则表达式。