刚学正则表达式的新手是不是总在这些地方碰壁?看着一堆 “\d”“*”“+” 符号就头大,不知道它们到底啥意思;好不容易搞懂基础语法,在 Python 里写的正则放到 JavaScript 里就报错;想验证个手机号、提取个邮箱,网上抄的代码时灵时不灵,改半天也找不到原因。别着急,兔子哥第一次学正则时就闹过笑话,在 Python 里用 “\d {11}” 匹配手机号,结果返回空列表,后来才发现忘了在字符串前加 “r”;换成 JS 写时,又因为没转义反斜杠,“\d” 写成 “\d”,同样匹配失败。今天就带零基础的朋友把正则语法、实战案例和 Python/JS 场景适配讲透,新手跟着学,正则使用不再踩坑,一起往下看吧!
一、基础问题:正则表达式到底是啥?为啥非学不可?
正则表达式是什么?能解决啥问题?
简单说,正则表达式就是一种 “文本匹配规则”,用特殊符号组合成 “规则代码”,快速从文本里找符合条件的内容。比如你想从一堆文字里挑出所有手机号,或者检查用户输的邮箱格式对不对,用正则表达式几行代码就能搞定,比手动写一堆 if 判断高效多了。
它在工作中特别常用:前端用它做表单验证(比如手机号、密码格式),后端用它提取日志里的关键信息,数据分析时用它清洗杂乱的文本数据。学会正则,能省很多重复劳动,这也是为啥它成了程序员必备技能。
必学核心语法符号,新手先吃透这 5 个
正则的核心是符号,就像数学里的加减乘除,每个符号有固定作用。新手不用记所有符号,先掌握这 5 个,基础匹配就够用了:
- \d:匹配任意数字(0-9),比如 “\d {2}” 能匹配 “12”“35”,但不能匹配 “ab”。
- \w:匹配字母、数字或下划线,比如 “\w+” 能匹配 “abc”“123”“a_b”,空格和特殊符号不算哦。
- .(点):匹配任意一个字符(除了换行),比如 “a.b” 能匹配 “aab”“a1b”“a@b”,只要中间是一个字符就行。
- (星号):表示前面的字符可以出现 0 次或多次,比如 “abc” 里的 b 可以没有(匹配 “ac”)、有 1 个(匹配 “abc”)、有多个(匹配 “abbc”)。
- +(加号):和星号类似,但前面的字符至少要出现 1 次,比如 “ab+c” 必须有 b,能匹配 “abc”“abbc”,但不能匹配 “ac”。
| 符号 | 作用 | 例子 | 匹配结果 |
|---|---|---|---|
| \d | 匹配数字 | \d{3} | 123、456 |
| \w | 匹配字母 / 数字 / 下划线 | \w{2} | ab、12、a_ |
| . | 匹配任意字符 | a.b | a1b、axb、a@b |
| * | 0 次或多次 | ab*c | ac、abc、abbc |
| + | 至少 1 次 | ab+c | abc、abbc |
兔子哥提醒:这些符号看着抽象,结合例子练几遍就熟了。比如记不住 “” 和 “+” 的区别,就想 “” 像星星一样可有可无,“+” 像加号一样必须有一个。
二、场景问题:Python 和 JS 里用正则,用法一样吗?哪里容易错?
基础用法对比:Python 和 JS 的正则创建方式
虽然核心语法一样,但 Python 和 JS 里用正则的 “姿势” 不同,新手不注意很容易踩坑。
| 场景 | Python 用法 | JavaScript 用法 | 关键区别 |
|---|---|---|---|
| 创建正则 | 用 re 模块,两种方式: 1. 字面量:r'\d {11}' 2. 构造函数:re.compile (r'\d {11}') | 两种方式: 1. 字面量:/\d {11}/ 2. 构造函数:new RegExp ('\d {11}') | Python 要加 “r” 避免转义;JS 构造函数里反斜杠要写两个 “\” |
| 匹配方法 | re.findall (reg, str):找所有匹配 re.search (reg, str):找第一个匹配 | str.match (reg):返回匹配结果 reg.test (str):返回 true/false(常用) | JS 的 test 方法更适合表单验证 |
比如匹配手机号,Python 代码是:
python
import retext = "手机号:13812345678"result = re.findall(r'1\d{10}', text) # 注意加rprint(result) # 输出:['13812345678']JS 代码是:
javascript
let text = "手机号:13812345678";let reg = /1\d{10}/; // 字面量方式// 或构造函数:let reg = new RegExp('1\\d{10}'); 注意两个反斜杠console.log(reg.test(text)); // 输出:true最容易踩的 3 个跨语言坑,新手提前避
- 转义字符处理不同
Python 里用 “r” 前缀让字符串不转义,所以 “r'\d'” 就是 “\d”;但 JS 里没有 “r” 前缀,字面量方式直接写 “/\d/”,构造函数方式必须用 “\d”(两个反斜杠),不然 “\d” 会被当成普通字符 “d”。 - 匹配方法返回值不同
Python 的 re.findall () 直接返回匹配内容的列表;JS 的 match () 返回包含分组的数组,test () 只返回布尔值,新手容易搞混什么时候用哪个方法。 - 修饰符写法不同
忽略大小写的修饰符,Python 里是在方法里传参数 “re.IGNORECASE”;JS 里是在正则后面加 “i”,比如 “/abc/i”,不用传参数。
网友 “前端小张” 分享:“之前把 Python 的正则直接抄到 JS 里,用构造函数写‘new RegExp ('\d {11}')’,结果一直匹配不到,后来才知道要写成‘new RegExp ('\d {11}')’,多一个反斜杠就好了!”
三、实战案例:Python/JS 各 2 个场景,边练边学
案例 1:验证手机号(国内规则:11 位数字,以 1 开头)
Python 实现:
需求:从文本中提取所有符合规则的手机号。
正则:r'^1 [3-9]\d {9}结尾,确保是完整的 11 位数字)
代码:
python
import retext = "用户1:13812345678,用户2:13987654321,无效号:1234567890"# 提取所有有效手机号phones = re.findall(r'1[3-9]\d{9}', text) # 简单提取用findallprint(phones) # 输出:['13812345678', '13987654321']JS 实现:
需求:表单输入时验证手机号格式,不合法提示错误。
正则:/^1 [3-9]\d {9}$/
代码:
javascript
let phoneInput = document.getElementById('phone');phoneInput.onblur = function() {let phone = this.value;let reg = /^1[3-9]\d{9}$/; // 字面量方式if (!reg.test(phone)) { // 用test方法判断this.nextElementSibling.textContent = '请输入正确的手机号';} else {this.nextElementSibling.textContent = '';}};案例 2:提取文本中的邮箱地址
Python 实现:
需求:从日志文本中提取所有邮箱。
正则:r'\w+@\w+.\w+'(\w + 匹配用户名和域名,. 匹配点)
代码:
python
import relog = "日志:用户abc@qq.com登录,用户x_y@163.com注册"emails = re.findall(r'\w+@\w+\.\w+', log)print(emails) # 输出:['abc@qq.com', 'x_y@163.com']JS 实现:
需求:实时检测输入的邮箱格式,正确时提示 “格式可用”。
正则:/\w+@\w+.\w+/
代码:
javascript
let emailInput = document.getElementById('email');emailInput.oninput = function() {let email = this.value;let reg = /\w+@\w+\.\w+/;let tip = this.nextElementSibling;if (reg.test(email)) {tip.textContent = '格式可用';} else if (email !== '') {tip.textContent = '邮箱格式错误(例:abc@qq.com)';}};四、解决方案:这些错误别再犯!不注意会怎样?
错误 1:转义字符漏写,匹配失败
问题:Python 里没加 “r” 前缀,写成 re.findall ('\d {11}', text);JS 构造函数里没写两个反斜杠,写成 new RegExp ('\d {11}')。
后果:正则里的 “\d” 被当成普通字符 “d”,匹配不到任何数字,返回空结果。
解决:Python 加 “r” 前缀;JS 构造函数用 “\d”,字面量用 “/d/”。
错误 2:贪婪模式导致过度匹配
问题:用 “
后果:获取的内容包含大量无关文本,甚至整个网页源码。
解决:加 “?” 启用非贪婪模式,写成 “
错误 3:边界符号缺失,匹配范围失控
问题:验证手机号用 “1\d {10}” 而不是 “^1\d {10}(结尾),确保整个字符串都符合规则。
五、自问自答:新手常问的问题
“正则表达式太难了,有没有捷径能快速学会?”
捷径就是 “先模仿再修改”!刚开始不用自己写复杂正则,找现成的模板(比如手机号、邮箱的正则),先用起来,再慢慢拆成单个符号理解。多在在线工具里测试,改改符号看结果怎么变,比死记语法快多了。
“Python 和 JS 的正则,我该先学哪个?”
看你的工作场景!做前端开发先学 JS 的正则,重点练表单验证;做后端或数据分析先学 Python 的,重点练文本提取。其实学会一个,另一个很容易上手,核心语法都一样,就差几个用法细节。
“在线工具那么多,哪个最适合新手?”
推荐 “菜鸟教程正则测试工具” 和 “RegExr”!前者干净无广告,能标红匹配位置;后者有语法提示,输入符号时会告诉你含义,新手不容易输错。测试正则时多换几个工具交叉验证,避免工具本身的误差。
结尾心得
正则表达式入门难在开头,但只要搞懂核心符号、分清 Python 和 JS 的用法差异,多练几个案例,很快就能上手。兔子哥的经验是,新手别一开始就追求 “万能正则”,先搞定工作中常用的场景(手机号、邮箱验证,简单文本提取),熟练后再挑战复杂匹配。遇到错误别慌,先检查转义字符、贪婪模式和边界符号,这三个地方最容易出问题。平时多在在线工具里测试,把常用正则模板存在笔记里,下次要用直接改,效率会很高。记住,正则是工具,用得多了自然就熟了,加油,新手也能轻松掌握!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~