regex - 如何捕获特定单词的所有条目,但不是另一个已知单词的一部分?
问题描述
我试图一次性匹配和替换文本中特定名称的所有匹配项(几句话),但问题是这个名称可以是另一个名称的一部分。示例:我需要替换名称“第 1 项”,但我也可以在句子中包含第 11 项或我的第 1 项或第 1 项测试,它们是已知名称,不应触及。已知不可触碰的名字列表是动态构建的。
从技术上讲,我想表达“匹配所有第 1 项,但如果它不属于 [第 11 项 | 我的项目 1 | 第1项测试]'
例句:由于第 1 项的促销,仅剩第 11 项。我想用“某物”替换第 1 项 预期输出:由于某物的促销,仅剩第 11 项。是否可以使用 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);
推荐阅读
- mysql - 将行从一个表复制到另一个由第三个表上的插入触发
- node.js - Node.js, AWS Cognito - 前端登录,后端用户验证
- c# - 为什么 aspnet 核心身份中的种子用户登录失败?
- youtube-api - youtube 数据 api 不适用于视频录制详细信息 - 显示错误 400 意外部分
- python - 关于按答案组对聊天数据进行采样的 Pandas 字符串操作问题
- javascript - [Vue]如何在 Loop 组件中使用 slot-scope
- apache-spark - 通过intellij在本地机器上启动时如何存储spark的日志输出?
- c# - 在 SQL Server 2016 中使用另一种类型(用户定义)创建表类型
- c++ - 测量函数调用期间的最大内存使用量
- javascript - TimeoutError 后重启 JS 脚本