【问题标题】:Regex syntax in a C# applicationC# 应用程序中的正则表达式语法
【发布时间】:2014-07-28 13:25:22
【问题描述】:

我试图弄清楚如何用空格替换字符串中的所有标点符号但保留一个特殊字符:'-'

例如句子

“嗨!我是个开箱即用的人,你知道吗?”

应该变成

“嗨,我是个开箱即用的人,你知道吗”

我知道解决方案将是单行 Regex 表达式,但我真的不习惯在 Regex 中“思考”,所以到目前为止我尝试的是将所有 '-' 替换为 '9',然后替换所有用 ' ' 标点符号,然后用 '-' 重新替换所有 '9'。它有效,但这很糟糕(特别是如果输入包含一些“9”字符):

string s = @"Hello! Hi want to remove all punctuations but not ' - ' signs ... Please help ;)";
                s = s.Replace("-", "9");
                s = Regex.Replace(s, @"[\W_]", " ");
                s = s.Replace("9", "-");

那么,有人可以帮我写一个只捕获与“-”不同的标点符号的正则表达式吗?

【问题讨论】:

    标签: c# regex string replace


    【解决方案1】:

    如何用空格替换以下正则表达式的匹配项:

    [^\w\s-]|_
    

    这表示任何不是单词字符、数字、空格或破折号的字符。

    【讨论】:

    • 这不会替换 OP 似乎想要替换的下划线。此外,\d 是多余的,因为它是 \w 的子集。
    【解决方案2】:

    这个正则表达式应该会有所帮助。使用Character class subtraction 从字符类中删除一些字符。

    var expected = Regex.Replace(subject, @"[_\W-[\-\s]]","");
    

    【讨论】:

      【解决方案3】:

      您可以使用Linq

      var chars = s.Select(c => char.IsPunctuation(c) && c != '-' ? ' ' : c);
      
      var result = new string(chars.ToArray());
      

      【讨论】:

      • 谢谢,它有效,但我想要一个正则表达式,我确定它是可能的。
      • @Kabulan0lak 这是一个很棒的解决方案,并且更容易维护一些您自己没有编写的正则表达式解决方案。
      • 这是我的第一个解决方案。但我真的很想了解正则表达式。我正在阅读一些文档并在正则表达式生成器上进行测试,但我在编写这个时遇到了问题。
      【解决方案4】:

      将您认为标点符号的所有内容放入集合[ ... ] 中,并在( ... ) 中将其作为单个 匹配字符进行替换.这是一个示例,我试图替换 !.,'?

       string text = "hi! I'm an out-of-the-box person, did you know ?";
      
      Console.WriteLine (
      
      Regex.Replace(text, "([!.,'?])", " ")
      
      );
      
      // result:
      // hi  I m an out-of-the-box person  did you know
      

      更新

      对于不想指定集合的​​正则表达式纯粹主义者可以使用集合减法。我仍然指定一组搜索任何非字母字符\W,它将匹配包括- 在内的所有项目。但是通过使用集合减法 -[ ... ] 我们可以将 - 排除在外。

      这就是例子

      Regex.Replace(text, @"([\W-[-]])", " ")

      // result:
      // hi  I m an out-of-the-box person  did you know 
      

      【讨论】:

      • 是的,我正在阅读 @SriramSakthivel 建议的“字符类减法”。这是我需要的。再次感谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 2017-11-19
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多