如何用正则表达式查找首个连续4个不重复字符的位置(AOC2022 Day6)
用正则表达式查找字符串中首个连续4个不重复字符的结束位置
我已经解决了2022年Advent of Code Day6的问题,现在想尝试用正则表达式实现:查找字符串中首个连续4个不重复字符的出现结束位置。
示例说明
示例字符串:bvwbjplbgvbhsrlpgdmjqwftvncz
- bvwbjplbgvbhsrlpgdmjqwftvncz:因存在重复字符b被排除
- bvwbjplbgvbhsrlpgdmjqwftvncz:匹配到第5个字符,即首个无重复的4字符块结束位置
我的尝试(未成功)
在R语言中我尝试了以下代码,但没有得到预期结果:
txt <- "bvwbjplbgvbhsrlpgdmjqwftvncz" str_match("(.*)\\1", txt)
解决方案
你的代码之所以失败,是因为"(.*)\\1"的作用是匹配任意重复的子串,和查找连续4个不重复字符的需求完全不相关。
要实现目标,可以借助R的stringr包,结合正向预查的正则表达式来确保连续4个字符无重复:
library(stringr) txt <- "bvwbjplbgvbhsrlpgdmjqwftvncz" # 匹配首个连续4个不重复字符的起始位置 start_pos <- str_locate(txt, "(?=(.)(?!\\1)(.)(?!\\1|\\2)(.)(?!\\1|\\2|\\3))")[, 1] # 结束位置为起始位置 + 3(因为4个字符从start_pos到start_pos+3) end_pos <- start_pos + 3 cat("首个无重复4字符块的结束位置:", end_pos, "\n")
运行以上代码会输出5,和示例预期一致。
正则表达式解释
(?=(.)(?!\\1)(.)(?!\\1|\\2)(.)(?!\\1|\\2|\\3))是一个正向预查:
(.)捕获第一个任意字符(?!\\1)确保第二个字符不等于第一个(?!\\1|\\2)确保第三个字符不等于前两个(?!\\1|\\2|\\3)确保第四个字符不等于前三个
这样就保证了接下来的4个连续字符完全不重复。
内容的提问来源于stack exchange,提问作者pluke
相关产品推荐
相关产品推荐

