正则-分组

分组 ():把多个字符打包成一个子表达式,对【一整组内容】施加量词(重复次数) 之前的量词 + * ? {n} 只能作用在单个字符/字符集上;加括号之后,量词作用于括号内全部内容

1. 基础示例

(\d{1,3}\.){3}\d{1,3} — 简易IP正则

  • \d{1,3}:1~3位数字
  • \d{1,3}\.:数字 + 点号
  • (\d{1,3}\.)打包成一个分组
  • {3}:让这个分组整体重复 3 次 → shturl.cc/Q.
  • 最后再接 \d{1,3} → 完整 shturl.cc/Q.xxx

缺点:只校验格式,不校验数值范围,会匹配 666.777.888.999,而这不是合法IP。

2. 合法IP分段表达式

2[0-4]\d|25[0-5]|[01]?\d\d?

这是单个IP段(0~255),用分支 | 分成3种情况:

  1. 2[0-4]\d200 ~ 249
    • 第一位固定2,第二位0~4,第三位任意数字
  2. 25[0-5]250 ~ 255
    • 25开头,第三位0~5
  3. [01]?\d\d?0 ~ 199
    • [01]?:可选0或1;后面最多两位数字。允许 00110199,支持前导零。

把这个分段打包进分组,重复3次加小数点,最后再接一段:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
  • (xxx\.){3}:合法IP段 + 点,整体重复3次
  • 最后一段不再带小数点

注意:这里外层还有一层括号,所以这是分组嵌套,分组可以嵌套使用。

3. 分组两大作用

1 给一组字符施加量词

例子:(boy){3}

  • (boy):分组,把 boy 打包
  • {3}:整组重复3次 匹配:boyboyboy 不会匹配 boyboyboyboyboyboy,也不会匹配 booooy

对比:boy{3},不加括号,量词只作用在 y boy{3} = bo + yyy → 匹配 boyyy

2 捕获内容(捕获分组)

() 默认是捕获分组:不仅整体匹配,还会把括号里面匹配到的内容单独保存下来,后续可以提取。

比如提取 <div>hello</div> 里面的 hello: <div>(.+?)</div> 整个正则匹配 <div>hello</div>分组1单独捕获 hello,爬虫、文本提取非常常用。

思考题

正则:(abc){2} 能匹配哪个字符串? 答案 abcabc

写正则匹配 ha 或者 haha 参考答案 (ha){1,2}

发表回复

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