基本上,我的目标是删除()中的所有内容,除了“”里面的字符串。
我在这里关注代码: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);
}
答案 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个字符的正则表达式。