如何指定将被正则表达式替换的位置
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 解析器。以上是关于如何指定将被正则表达式替换的位置的主要内容,如果未能解决你的问题,请参考以下文章