如何指定将被正则表达式替换的位置

Posted

技术标签:

【中文标题】如何指定将被正则表达式替换的位置【英文标题】:How to specify positions that will be replaced with Regular expression 【发布时间】:2020-02-01 17:31:54 【问题描述】:

我有正则表达式 (?!\,)(?!X)3[0-9\.\w\s\+\-\:\,]+ 和类似

的字符串
"1", "S1", "S2", "1", "2"
"1", "S1", "S2", "1", 2
"1", "S1", "S2", "1", "2", 3

我正在尝试使用正则表达式(通过匹配)解析该字符串,但我不擅长正则表达式。

我需要处理元素 "1", "S1", "S2" 并跳过元素 "1", "2"。第一个想法是在正则表达式逻辑中指定,例如“不要出现从右边开始(“2”-2)和从右边开始第二次出现(“1”-1),但要考虑所有其他出现”。

主要思想是这个逻辑应该只使用正则表达式,而不是 C# 代码(我说的是在 C# 匹配数组中匹配对象位置 - 没有 C# 逻辑,应该只使用正则表达式)。

如何更改我的正则表达式 (?!\,)(?!X)3[0-9\.\w\s\+\-\:\,]+ 以指定不应处理的位置?

【问题讨论】:

你尝试用正则表达式匹配什么?它不匹配任何合理的东西:(?!X)3 前瞻被量化,前瞻未锚定,字符类包含0-9\w 已经存在...... 这应该使用 CSV 解析器进行解析。正则表达式解决方案将充满错误。 (?<=^"|,\s*")[^"]+(?="$|",)(?!(?:",\s*"[^"]*)0,1"$) 之类的东西可以满足您的需求。 所以你想要左边的所有内容都指向最后两个元素? 对 MonkeyZeus:是的,你是对的。我需要忽略最后两个事件。 【参考方案1】:

我想你想要:

^.*(?= *, *"?.*?"?, *"?.*?"?)

这将匹配最后两个元素之前的所有内容。

https://regex101.com/r/wMWaKF/2

【讨论】:

感谢您的回答,但我已经更新了我的问题,因为看起来我以错误的形式提问。输入字符串可以是"1", "S1", "S2", "1", "2""1", "S1", "S2", "1", 2"1", "S1", "S2", "1", "2", 3 所以,这个reg exp 不适用于我所有的输入字符串。我的意思是,字符串是按长度动态调整大小的 @Arthur 需要稍作修改以适应整数等无引号值。查看我更新的 regex 和 regex101 链接。 嗯,有趣的解决方案,但它破坏了“选择每个元素”(?!\,)(?!X)3[0-9\.\w\s\+\-\:\,]+ 的逻辑。即,匹配看起来像整个部分"1", "S1", "S2",没有被元素分割。在我的 reg exp 中,每个匹配项都是每个元素 - regex101.com/r/eU18aV/1 。是否可以将您的 reg exp 与我的合并,以获取 line 的每个元素的匹配项,除了最后两个元素? @Arthur 你可以试试"?(.*?)"?(?= *, *"?.*?"?, *"?.*?"?),但你真的应该只使用 CSV 解析器。

以上是关于如何指定将被正则表达式替换的位置的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式位置匹配攻略【转】

C#正则表达式指定替换

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

批处理正则表达式怎样替换第二个指定字符

如何使用正则表达式替换除指定字符串之外的所有内容

java 字符串替换