Regex 如何捕获特定单词的所有条目,但不作为其他已知单词的一部分?

Regex 如何捕获特定单词的所有条目,但不作为其他已知单词的一部分?,regex,Regex,我试图一次匹配并替换文本中特定名称的所有匹配项(几句话),但问题是这个名称可能是另一个名称的一部分。 例子: 我需要替换一个名称“第1项”,但我可以在句子中也有第11项或我的第1项或第1项测试,它们是已知的名称,不应该被触碰。 已知不可接触名称的列表是动态生成的 从技术上讲,我想表达“匹配所有项目1,但如果它不是[项目11 |我的项目1]的一部分 |第1项测试]' 例句:由于项目1的促销,只剩下项目11。 我想用“某物”代替第1项 预期输出:由于某物的促销,只剩下第11项。 使用正则表达式可以实

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

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

例句:由于项目1的促销,只剩下项目11。 我想用“某物”代替第1项 预期输出:由于某物的促销,只剩下第11项。
使用正则表达式可以实现吗

对于您的特定场景,您可以使用:

(?<!My )\bItem 1\b(?! Test)
(?

有了PCRE,您可以依靠跳过失败技术:

(?:Untouchable1|Untouchable2|Untouchable3|other words to keep)(*SKIP)(*F)|other|words|to|match-and-replace
由于您使用的是.NET,即C#,并且具有访问代码,因此您可以使用一种模式,在该模式中捕获需要替换的单词并仅匹配需要保留的单词,然后使用匹配计算器检查组1的值:如果组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);

每个条目(
Item 1
Item 11
,…)是否出现在单独的一行中?@MonkeyZeus,不是。K不能用单词边界覆盖我的情况。简单地说,这个场景不起作用:“我的Item 1 test”是一个已知的不可触及的名称。我需要替换“Item 1”只有当它不是其他已知的不可接触名称的一部分时,我不明白,所以您只需要精确的匹配?如果是这样,那么使用锚定
^Item 1$
。如果您使用的是编程语言,那么简单的字符串比较将以指数级速度进行。
如果($Item=='Item 1'){}else{
@Bee,不,它们可能只是同一句话的一部分回调很容易,PCRE模式也很容易。PCRE模式看起来像
(?:不可触摸1 |不可触摸2 |不可触摸3 |等)(*跳过)(*F)关于特定场景的其他有效的< /代码> -是的,对于我的动态情况,没有。正如我前面所说的:我在考虑前和后缀,但是有可能组合几个选项。考虑这个例子,我假设3个已知的名字或产品。项目1,新项目1,旧项目1。我想用“项目1超级”替换“项目1”。例如“我们这里有一个项目1,它是旧项目1 Ex的替代品,与新项目1不同”。@JohnConstantine您必须按长度降序排列已知的不可触及物品,用唯一的占位符替换它们的存在,执行
项目1
->
项目1 Super
替换,最后带回通过使用占位符执行反向替换来删除不可触及项。您需要编程来实现您的设想;纯正则表达式是不可能的。