正则表达式跳过标点符号,但@ {digit}除外

时间:2017-10-02 07:40:07

标签: regex

目前,我正在使用[^\w\d]查找所有标点符号,并将其替换为空格。

例:
The quick brown fox jumps ~!@# over the lazy dog
成为
The quick brown fox jumps over the lazy dog

它工作正常,但有时会出现@{100}等特定情况。

The quick brown fox jumps ~!@# over @{100} the lazy dog
应成为:
The quick brown fox jumps over @{100} the lazy dog

不搞砸@{100}。有人可以帮忙吗?模式始终为@{digit}

2 个答案:

答案 0 :(得分:2)

在.NET正则表达式中,没有办法跳过匹配,也不支持可以启用纯正则表达式解决方案的条件替换模式。您需要匹配并捕获@{digits}部分并匹配非单词(我相信最好也排除此模式中的空格)字符。然后,检查匹配的组,并相应地替换:

var result = Regex.Replace(s, @"(@{[0-9]+})|[^\w\s]", m => 
            m.Groups[1].Success ? m.Value : " ");

请参阅C# demo

var s = "The quick brown fox jumps ~!@# over @{100} the lazy dog";
var result = Regex.Replace(s, @"(@{[0-9]+})|[^\w\s]", m => 
    m.Groups[1].Success ? m.Value : " ");
Console.WriteLine(result);
// => The quick brown fox jumps      over @{100} the lazy dog

<强>详情

  • (@{[0-9]+}) - 第1组:@{,1个或多个数字,}
  • | - 或
  • [^\w\s] - 任何不是单词而不是空白字符的字符
  • m.Groups[1].Success ? m.Value : " " - 如果第1组匹配,则将整个匹配放回原处,否则,替换为单个常规空间。

答案 1 :(得分:0)

您可以使用负向前瞻和后瞻将您的标准细分为案例,如下所示:

[^\w\d\s@\{\}]+|@(?!\{\d+\})|(?<!@)\{(?!\{\d+\})|(?<!@{\d+)\}

这里有四种情况,它们将匹配:

  • @{}
  • 之外的所有标点符号
  • @字符,仅在未跟\{\d+\}
  • 的情况下
  • {字符,仅当前面没有@且后面没有\{\d+\}
  • }字符,仅在前面没有{\d+
  • 的情况下

由于您使用.NET,因此最后一部分是可行的。 .NET正则表达式引擎支持非固定宽度负向lookbehind(这由.NET支持,但不支持许多其他正则表达式引擎)。