量词:控制前面紧邻的那个字符/分组重复多少次
| 量词 | 含义 |
|---|---|
* | 0次或更多 ≥0 |
+ | 1次或更多 ≥1 |
? | 0次或1次 ≤1 |
{n} | 恰好n次 |
{n,} | n次或更多 |
{n,m} | n ~ m次 |
1. 匹配带有两个或者两个以上字母o的单词
写法:
\b[a-z]*o{2,}[a-z]*\b错误问题:这个只能匹配连续两个及以上o,例如
book(oo连续)可以匹配;但
bono(o不连续,两个o分开)匹配不到。如果需求:单词里一共至少2个o(可分开)
\b(?=([a-z]*o){2})[a-z]+\b
如果需求:连续两个及以上o,表达式是正确的:\b[a-z]*o{2,}[a-z]*\b
小结:
o{2,}作用对象只有o,代表连续重复。
2. 匹配有重复字母的单词
写法:
\b[a-z]*[a-z]{2}[a-z]*\b错误:
[a-z]{2}只是任意两个连续字母,比如ab也会命中,它不是“同一个字母重复”。例如单词
cat,ca是两个不同字母,也会被你的正则匹配,不符合需求。
匹配同一个字母连续重复(如 apple 里的 pp):
\b[a-z]*([a-z])\1[a-z]*\b
Code language: CSS (css)
解释:
([a-z]):捕获一个字母到分组1\1:反向引用,代表和分组1里面一模一样的字符,也就是同一个字母
拓展:如果要匹配单词内存在重复字母(不一定连续,如
alpha有两个a),要用环视。
3. 匹配3到8个字母组成的单词
写法:
[a-z]{3,8}缺陷:缺少单词边界,会从长单词里截取片段。 例如单词
abcdefghij(10个字母),中间cdefgh6个字母会被单独匹配出来。
完整写法:
\b[a-z]{3,8}\b
含义:整个单词,字符只能是小写字母,长度3~8个字符。
4. 匹配每一行的第一个单词
写法:
^[a-z]+基本正确。
^:行开头(多行模式下^才会匹配每行开头;单行模式只匹配整个字符串开头)[a-z]+:1个及以上小写字母
注意:如果行首有空格,例如 hello world,^[a-z]+ 匹配不到。 如果行首允许有空白,要先跳过空格:
^\s*[a-z]+
Code language: CSS (css)
小练习题
- 匹配
hello连续出现 2~4次,例如hellohello、hellohellohello - 匹配手机号:1开头,后面恰好10位数字