目前,我正在使用[^\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}
。
答案 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支持,但不支持许多其他正则表达式引擎)。