You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式查找首个连续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:15:38