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

寻求易读的Raku正则:匹配连续2+点但排除3个连续点

可读性强的Raku实现方案:匹配含2+连续点但无3个连续点的字符串

核心思路

把需求拆成两个清晰的判断条件,完全避开难以理解的负向前瞻断言:

  1. 字符串中不存在3个连续的点
  2. 字符串中至少存在1组2个及以上的连续点

代码实现

my @valid-strings = (
    "Yes.. Please go away.",
    "I have the ball..",
    "In this case....I vote yes."
);

my @invalid-strings = (
    "You said this because...?",
    "I dream...",
    "Suppose...oh, wait."
);

# 检查单个字符串是否符合条件
sub is-valid($str) {
    return $str !~~ / \.\.\. / && $str ~~ / \.\. /;
}

# 验证示例
say "符合条件的字符串:";
.say if is-valid($_) for @valid-strings;

say "\n不符合条件的字符串:";
.say unless is-valid($_) for @invalid-strings;

代码解释

  • $str !~~ / \.\.\. /:!~~ 是Raku的「不匹配」操作符,这里用来检查字符串中没有三个连续的点
  • $str ~~ / \.\. /:~~ 是Raku的「匹配」操作符,这里用来检查字符串中至少有一组两个连续的点(四个及以上的连续点也会被匹配,因为前两个点会触发匹配逻辑)

单个正则的替代方案

如果一定要用单个正则表达式实现,也可以写成直观的结构:

/ ^ <-[.]*> ( \. ** 2 | \. ** 4..* ) ( <-[.]*> ( \. ** 2 | \. ** 4..* ) )* <-[.]*> $ /

解释:

  • ^ 和 $ 锚定字符串首尾,确保检查整个内容
  • <-[.]*> 匹配任意数量的非点字符
  • ( \. ** 2 | \. ** 4..* ) 匹配「恰好2个点」或「4个及以上的点」
  • 整个结构重复,确保所有连续点的长度都符合要求,且至少存在一组这样的连续点

内容的提问来源于stack exchange,提问作者jubilatious1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:13:10