重复出现

量词:控制前面紧邻的那个字符/分组重复多少次

量词含义
*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 也会命中,它不是“同一个字母重复”。

例如单词 catca 是两个不同字母,也会被你的正则匹配,不符合需求。

匹配同一个字母连续重复(如 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个字母),中间 cdefgh 6个字母会被单独匹配出来。

完整写法:

\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)

小练习题

  1. 匹配 hello 连续出现 2~4次,例如 hellohellohellohellohello
  2. 匹配手机号:1开头,后面恰好10位数字

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注