【问题标题】:Regex - add space between replaced characters正则表达式 - 在替换字符之间添加空格
【发布时间】:2026-01-10 13:30:01
【问题描述】:

我有一个正则表达式@"\bAND\b|\bOR\b|""|\(|\)",它可以从字符串中删除某些单词或字符。我遇到的问题是,如果使用以下文本:

入耳式耳机“或”入耳式耳机

当我使用 regex.replace 时,正则表达式成功输出“OR”,但两个查询将混合在一起

入耳式耳机戴入耳式耳机

仅当我要删除的单词与其他查询词之间的单词之间没有空格时才会发生这种情况。如果不存在,是否有一种优雅的方法可以在我要删除的关键字之间添加空格。

【问题讨论】:

标签: c# regex


【解决方案1】:

我知道这听起来可能很傻,但是您是否尝试过用一个空格代替它而不是直接删除它?

【讨论】:

    【解决方案2】:

    在替换文本中添加一个空格,然后创建后续的正则表达式替换以在未满足此条件时去除 2 个或更多空格。

    这样可以保证每个单词之间有一个空格。

    为简洁起见,这是一个基本示例(没有引用您的 "OR"),但概念是相同的:

    Regex.Replace(Regex.Replace(txt, "OR", " "), @"\s\s", " ")
    

    结果

    Over ear headphones on ear headphones
    

    【讨论】:

    • 如果你一开始就匹配任何空格会不会更容易,比如:Regex.Replace(txt, @"OR\s*", " ");?这样你就不必调用 Regex.Replace 两次了。
    • @JulianA 将其作为答案。 :-)
    【解决方案3】:

    这应该保留现有格式(以及可以预期的)。

    要使用非换行符空格,请将 \s 替换为 [^\s\r\n]
    或类似的。


    只需选择在表达式的任一侧使用一个空格,然后替换为您选择的空格。

    这是在被文本包围的项目上完成的。

    A<sp><item>B     => A<sp>B  
    A<sp><item>B<sp> => A<sp>B  
    A<item><sp>B     => A<sp>B  
    A<item>B         => A<sp>B  
    

    用于字符串开头或结尾的项目
    替换为空字符串。

    这是正则表达式@"(^)?\s?(?:\b(?:AND|OR)\b|[()""])+\s?($)?"

    展开

     ( ^ )?                        # (1)
     \s? 
     (?:
          \b 
          (?: AND | OR )
          \b 
       |  [()"] 
     )+
     \s? 
     ( $ )?                        # (2)
    

    C#

    string sTrg = @"""Over ear headphones""OR""on ear headphones""";
    Console.WriteLine("{0}", sTrg);
    
    Regex rX = new Regex(@"(^)?\s?(?:\b(?:AND|OR)\b|[()""])+\s?($)?");
    Console.WriteLine("{0}", rX.Replace(sTrg,
        delegate (Match m) {
           if (m.Groups[1].Success || m.Groups[2].Success)
               return "";
           return " ";
       }));
    

    输出

    "Over ear headphones"OR"on ear headphones"
    Over ear headphones on ear headphones
    

    【讨论】: