写正则的基本思路
写正则就是用符号描述”我要匹配的文本长什么样”,从左到右一段段拼:先想清楚”由哪些字符组成、各重复多少次、是否要固定开头结尾”。
第 1 步:描述字符
- 具体字符直接写:
abc。 - 一类字符用字符类:数字
\d、字母数字\w、或自定义[a-z]、[aeiou]。 - 任意字符用
.(默认不含换行)。
第 2 步:描述数量
给字符加量词说明重复几次:
\d{4}—— 恰好 4 个数字\w+—— 一个或多个字母数字-?—— 可有可无的连字符\d{2,4}—— 2 到 4 个数字
第 3 步:分组与选择
- 用
( )把要整体重复或提取的部分括起来:(\d{4})-(\d{2})会捕获年和月两组。 - 命名组更易读:
(?<year>\d{4})。 - 用
|表示”或”:(jpg|png|gif)。
第 4 步:加锚点定边界
^开头、$结尾:^1[3-9]\d{9}$校验整串是手机号。\b单词边界:\bcat\b只匹配独立的 cat,不匹配 category。
贪婪 vs 非贪婪(高频坑)
量词默认贪婪(尽量多匹配)。对 <a><b> 用 <.*> 会匹配整段;想只匹配 <a>,用非贪婪 <.*?>。匹配”过头”时,先想想是不是该加 ?。
在代码里用
同一条正则,各语言写法略不同:
- JavaScript:
/正则/flags,如str.match(/\d+/g) - Python:
import re; re.findall(r'\d+', s)(用 raw 字符串r''避免反斜杠转义) - Java:
Pattern.compile("\\d+")(字符串里反斜杠要双写)
写的时候在 正则表达式测试器 里实时看高亮和分组,确认无误再贴进代码。