【问题标题】:Remove Everything Between Two Characters As Long As They Aren't Inside Some Other Characters删除两个字符之间的所有内容,只要它们不在某些其他字符内
【发布时间】:2011-06-05 23:02:34
【问题描述】:

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

我在这里关注代码: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);
}

【问题讨论】:

  • 是否还要求用户可以使用转义字符在双引号内插入双引号? (“狗说“汪”)

标签: c# .net regex


【解决方案1】:

.NET 正则表达式比通常的更强大,您肯定可以为所欲为。看看这个,它寻找平衡的括号,这与你的问题基本相同,但使用括号而不是引号。

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

【讨论】:

    【解决方案2】:

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

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

    这会产生以下结果:

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

    不清楚您是否要保留引号 - 如果要保留,请使用 $1 而不是 $2

    现在你已经有了工作的正则表达式,你应该可以让它在 C 中为你工作。

    【讨论】:

    • 这在 .NET 实现中不起作用。我在这里试过:derekslager.com/blog/posts/2007/09/…
    • @Andrew - 一定有办法让它以某种方式工作 - 甚至 .NET 肯定也有行业标准的正则表达式处理?
    • 对于那个很棒的正则表达式只有一个 +1... cry
    【解决方案3】:

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

    但我要说的是,这真的会拉伸正则表达式,而您的问题很适合Automata-based programming

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

    【讨论】:

    • @Bohemian - 我觉得有两个理由是正确的 1) 有人确实提供了答案 2) 我还是更喜欢 20 行 FSA 代码 :-)
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2022-11-22
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多