首页 > 解决方案 > 如何捕获特定单词的所有条目,但不是另一个已知单词的一部分?

问题描述

我试图一次性匹配和替换文本中特定名称的所有匹配项(几句话),但问题是这个名称可以是另一个名称的一部分。示例:我需要替换名称“第 1 项”,但我也可以在句子中包含第 11 项或我的第 1 项或第 1 项测试,它们是已知名称,不应触及。已知不可触碰的名字列表是动态构建的。

从技术上讲,我想表达“匹配所有第 1 项,但如果它不属于 [第 11 项 | 我的项目 1 | 第1项测试]'

例句:由于第 1 项的促销,仅剩第 11 项。我想用“某物”替换第 1 项 预期输出:由于某物的促销,仅剩第 11 项。是否可以使用 RegEx 实现?

标签: regex

解决方案


使用 PCRE,您可以依赖 SKIP-FAIL 技术:

(?:Untouchable1|Untouchable2|Untouchable3|other words to keep)(*SKIP)(*F)|other|words|to|match-and-replace

由于您使用的是 .NET,即 C#,并且具有访问代码,因此您可以使用一种模式来捕获您需要替换的单词并匹配您需要保留的单词,然后使用匹配评估器检查第 1 组value:如果 Group 1 匹配成功,则替换,否则保持匹配。

var pattern = @"Untouchable1|Untouchable2|Untouchable3|other words to keep|(other|words|to|match-and-replace)";
var result = Regex.Replace(testString, pattern, m => 
    m.Groups[1].Success ? replaceWith : m.Value);

推荐阅读