寻求易读的Raku正则:匹配连续2+点但排除3个连续点
可读性强的Raku实现方案:匹配含2+连续点但无3个连续点的字符串
核心思路
把需求拆成两个清晰的判断条件,完全避开难以理解的负向前瞻断言:
- 字符串中不存在3个连续的点
- 字符串中至少存在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
相关产品推荐
相关产品推荐

