在Julia中查找匹配复杂模式的所有子串
Julia正则表达式匹配特定子串
需求说明
需要匹配字符串中满足以下条件的所有子串:
- 子串以至少N个连续的2、3、4组成的序列开头(顺序任意、可重复)
- 子串以以下两种模式之一结尾:
- 单个字符
6 - 至少M个连续的5(若需求是“超过M个”,则改为至少M+1个)
- 单个字符
正则表达式构造
根据需求,可通过插值构造动态正则表达式(Julia支持在正则中插入变量):
完整代码示例
# 定义规则参数 N = 3 # 开头的2/3/4序列最小长度 M = 2 # 连续5的最小数量(若需求是"超过M个",后续替换为M+1即可) # 构造正则表达式:匹配从非2/3/4字符后开始的符合条件的子串 # 若需要允许从连续2/3/4中间开始匹配,去掉 (?<![234]) 即可 pattern = Regex("(?<![234])([234]{$N,})(6|5{$M,})") # 测试字符串(空格仅为视觉区分,实际匹配不受空格影响) test_string = "1111122211111 2323232234233246 5161532161 232342342322224444223323555555" # 查找所有匹配结果 matches = eachmatch(pattern, test_string) # 输出匹配内容 println("Matches found:") for match in matches println(match.match) end
正则各部分解释
(?<![234]):负向后行断言,确保匹配的子串前不是2、3、4,避免从一段连续的2/3/4序列中间开始匹配(比如避免把2342346拆成多个重叠匹配)([234]{$N,}):匹配至少N个连续的2、3、4,满足开头长度要求(6|5{$M,}):匹配结尾的单个6,或至少M个连续的5;若需求是“超过M个连续5”,则改为5{$(M+1),}
测试结果
当N=3、M=2时,代码会输出:
2323232234233246 232342342322224444223323555555
完全符合测试案例预期:第一个和第三个子串不匹配,第二个和第四个子串匹配。
内容的提问来源于stack exchange,提问作者lafinur
相关产品推荐
相关产品推荐

