仅匹配奇数/偶数索引的正则表达式

4
有没有一种正则表达式只匹配从奇数或偶数索引开始的字符串?我的用例是一个十六进制字符串,我想替换某些“字节”。
现在,当尝试匹配20(空格)时,“7209”中的20也会被匹配,即使它由7209组成。在这种情况下,我受限于Notepad++的正则表达式实现,因此无法像Java那样检查匹配索引。
我的示例输入如下:
324F8D8A20561205231920

我在这里设置了一个测试页面,正则表达式应该只匹配20的第一次和最后一次出现,因为中间的那个从奇数索引开始。


有没有任何东西来限定字符串的开头和结尾? - Explosion Pills
1
请检查 20(?=(?:\d{2})+|\D|$) 是否适用于您。 - Wiktor Stribiżew
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - RikuXan
@stribizhev,您发布的正则表达式匹配所有以20开头的数字,但遗憾的是它也匹配了不应匹配的数字(例如7209)。 - RikuXan
请提供一些输入文本,没有它很难猜测模式可能是什么。 - Wiktor Stribiżew
3个回答

4
您可以使用以下正则表达式在十六进制字符串的偶数位置匹配 20
20(?=(?:[\da-fA-F]{2})*$)

请查看演示

在这种情况下,我假设字符串中没有空格。

如果值之间有空格(或任何其他符号),可以尝试使用以下替代方法(使用$1XX类似的替换字符串):

((?:.{2})*?)20

查看另一份演示文稿


为什么要在结尾使用“或”运算符?它不能更简单吗,像这样:20(?=(?:[\da-fA-F]{2})*$) - Bram Vanroy
@BramVanroy:确实,20(?=(?:[\da-fA-F]{2})+$|$)等于20(?=(?:[\da-fA-F]{2})*$)。我没有注意到开头的示例输入字符串,而是在处理不同的事情。那只是以前努力的残留物。谢谢你注意到了。但是,开销只增加了一个额外的单步骤。 - Wiktor Stribiżew

1

这似乎适用于偶数:

rx <- "^(.{2})*(20)"

strings <- c("7209","2079","9720")

grepl(rx,strings) # [1] FALSE  TRUE  TRUE

它对我来说完全匹配,在Notepad++和Regex101(https://regex101.com/r/eV7rR9/1)中都是如此。 - RikuXan
定义奇数和偶数 - 你的索引是从零开始还是从一开始? - C8H10N4O2
对的,它匹配了字符串,因为在位置20(偶数索引)有一个20。你想捕获整个字符串还是只有20? - C8H10N4O2
现在它只匹配我的测试字符串中的最后20个,而不是第一个(请参见https://regex101.com/r/cN6fE2/1) - RikuXan
没错,你可能需要在一个非捕获组中重复 https://dev59.com/QXA75IYBdhLWcg3wBkS1 - C8H10N4O2
显示剩余2条评论

1

我不确定Notepad++使用哪个正则表达式引擎——因为我已经有一段时间没有使用它了。这个在javascript中可以工作...

/^(?:..)*?(20)/

...

/^     # start regex
(?:    # non capturing group
..     # any character (two times)
)*?    # close group, and repeat zero or more times, un-greedily
(20)   # capture `20` in group
/      # end regex

你的正则表达式只匹配了最后一个20的出现位置,即使在JS引擎中也是(请参见https://regex101.com/r/rF7bS1/2) - RikuXan
通过去掉^,它似乎可以工作,否则它只会匹配第一个出现的,即使全局开启,但是它似乎不完全健壮,因为它在这里(https://regex101.com/r/hY8kK7/3)中断了。 - RikuXan
没有锚点的话,它会崩溃,^$ 是必要的,但是如果没有可变宽度的后行断言,使用 ^ 作为参考点就没有意义了。我选择了 $,因为在 Notepad++ 正则表达式风格中 lookahead 不是固定宽度的。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接