为何用正则表达式判断质数的测试失败?
解决bash中用正则判断全1字符串长度是否为质数的问题
原正则的逻辑说明
你提到的正则 /^1?$|^(11+?)\1+$ 是匹配非质数长度的全1串,逻辑如下:
^1?$:匹配空串或单个1(对应长度0、1,均非质数)^(11+?)\1+$:捕获一段长度≥2的连续1,然后重复这段捕获内容至少1次,且完全覆盖整个字符串——意味着总长度是捕获段长度的倍数(即合数)
bash中测试失败的原因
- 加
/导致无输出:/是JavaScript等语言的正则字面量分隔符,bash的grep会把它当作普通字符处理。而你的测试字符串是纯1,不含/,自然匹配不到,所以无输出。 - 不加
/但所有串都被匹配:默认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
相关产品推荐
相关产品推荐

