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

为何用正则表达式判断质数的测试失败?

解决bash中用正则判断全1字符串长度是否为质数的问题

原正则的逻辑说明

你提到的正则 /^1?$|^(11+?)\1+$ 是匹配非质数长度的全1串,逻辑如下:

  • ^1?$:匹配空串或单个1(对应长度0、1,均非质数)
  • ^(11+?)\1+$:捕获一段长度≥2的连续1,然后重复这段捕获内容至少1次,且完全覆盖整个字符串——意味着总长度是捕获段长度的倍数(即合数)

bash中测试失败的原因

  1. 加/导致无输出:/是JavaScript等语言的正则字面量分隔符,bash的grep会把它当作普通字符处理。而你的测试字符串是纯1,不含/,自然匹配不到,所以无输出。
  2. 不加/但所有串都被匹配:默认grep用的是基础正则(BRE),其中+、?、|这些元字符是普通字符,不会被解析为正则语法。你需要启用扩展正则(ERE)才能正确解析原正则的逻辑。

正确的测试命令

1. 验证非质数长度的全1串(匹配则为非质数)

使用grep -E启用扩展正则:

# 测试3个1(质数,无输出)
echo "111" | grep -E '^1?$|^(11+?)\1+$'
# 测试4个1(非质数,输出"1111")
echo "1111" | grep -E '^1?$|^(11+?)\1+$'

2. 直接筛选质数长度的全1串(反向匹配)

用-v参数取反匹配结果,输出的就是质数长度的串:

# 测试3个1(质数,输出"111")
echo "111" | grep -vE '^1?$|^(11+?)\1+$'
# 测试4个1(非质数,无输出)
echo "1111" | grep -vE '^1?$|^(11+?)\1+$'

补充说明

  • 非贪婪匹配+?在这里可以替换为贪婪的+,效果完全一致——因为\1+要求捕获组必须重复到覆盖整个字符串,贪婪与否不影响最终匹配结果。
  • 若使用grep的基础正则(BRE),需要对元字符转义,命令会变成:
    echo "111" | grep '^1\?$\|^\(11\+\)\1\+$'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:26:14