
本文聚焦“字符串过滤”这一高频场景,从常用正则写法(比如过滤特殊字符、去除HTML标签、提取邮箱/手机号)入手,结合实战案例(比如表单校验、日志清洗、爬虫内容提纯),拆解正则的设计逻辑:怎么精准匹配目标字符?怎么避免误判?怎么优化效率?不管是刚接触正则的新手,还是想补实战经验的开发者,都能通过本文快速掌握“用正则精准过滤字符串”的核心方法,解决工作中80%的字符串处理问题。
你有没有过这种情况?运营让你清理用户留言里的乱码,你手动删了半小时,眼睛都花了还没弄完;或者爬虫爬了篇文章,里面全是
标签,复制出来根本没法读?我去年就帮朋友解决过这事儿——当时她盯着几百条留言里的emoji和火星文,快哭了,结果我用两行正则,5分钟就搞定了。其实正则没你想的那么难,今天我把自己常用的字符串过滤正则写法和案例整理出来,你直接抄作业就行,保证解决你80%的字符串处理问题。
先搞懂:字符串过滤用正则,到底在解决什么问题?
其实正则的核心就俩事儿——要么“找出你要留的内容”,要么“找出你要删的内容”。比如运营朋友的问题是“删了留言里的非文字内容”,那我们就写个正则,匹配所有不是中文、英文、数字的字符,然后替换成空;再比如爬虫的问题是“删了HTML标签”,那我们就写个正则,匹配所有<
到>
的内容,替换成空。
去年我帮那个朋友的时候,她一开始说“正则好难啊,我学不会”,结果我给她演示了一遍,她立刻说“原来这么简单!”——真的,你不用记住所有正则语法,只要搞懂你要解决的问题对应的“模式”就行。比如:
<
开始到>
结束的所有内容”(删掉它们); MDN Web Docs里说得特实在:“正则表达式是处理字符串的强大工具,尤其适合模式匹配和替换”——它的本质就是帮你“按规则找东西”,比手动处理或字符串分割靠谱100倍。比如我之前帮技术部朋友分析用户日志,要提取里面的手机号,用字符串分割老出错(比如手机号中间有空格),用正则1[3-9]d{9}
一下就找出了所有手机号,效率提升了80%。
直接抄作业:常用字符串过滤正则的写法+实战案例
我把自己平时用得最多的几个场景整理好了,每个都带写法、原理、实战案例,你直接复制粘贴就能用。
正则表达式:[^u4e00-u9fa5a-zA-Z0-9]
说明:^
在中括号里表示“非”,u4e00-u9fa5
是中文,a-zA-Z
是英文,0-9
是数字——合起来就是“匹配所有不是中文、英文、数字的字符”。 实战案例:去年帮运营朋友清理公众号留言,用户发的内容里全是emoji(比如😂😭)、火星文(比如“朙兲見”)和奇怪符号(比如★→),她手动删了3小时才处理了100条。我给她写了这个正则,用Python的re.sub()
方法替换成空字符串,5分钟就处理完了500条留言,她当场给我买了杯奶茶。 注意:如果想保留部分符号(比如逗号、句号),可以把它们加到正则里,比如[^u4e00-u9fa5a-zA-Z0-9,.]
——这样逗号和句号就不会被删了。
正则表达式:]>
说明:<-
匹配标签的开始,[^>]
匹配除了>
之外的所有字符(包括标签里的属性,比如class="xxx"
),>
匹配标签的结束——这样就能把整个HTML标签(比如
)都匹配到。 实战案例:我之前爬知乎的文章,想把内容复制到Word里编辑,结果粘贴后全是
标签,手动删得我手酸。后来用这个正则替换,一下就把所有标签都删了,只剩纯文本,直接能用——比手动删省了半小时。 踩坑提醒:别用<-.>
!这个是“贪婪匹配”,会匹配从第一个<
到最后一个>
的所有内容,比如你有
第一段
第二段
,用
会把整个内容都匹配成
第一段
第二段
,直接删掉所有内容。一定要用]>
或者
(非贪婪匹配),我之前就踩过这个坑,差点把爬的内容全删没了,后来查了MDN的文档才改对。
这类场景是“提取你要的内容”,比如从一堆文字里找出手机号、邮箱,或者从日志里提取商品价格——正则的优势就是“不管内容多乱,只要格式对就能找到”。
举几个最常用的例子:
1[3-9]d{9}
(匹配11位符合手机号格式的数字,比如13812345678); [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+.[a-zA-Z0-9_-]+
(匹配大多数邮箱格式,比如xxx@yyy.com、xxx-yyy@zzz.cn); d+.d{2}
(匹配带两位小数的价格,比如19.99、123.45)。 实战案例:上个月帮电商运营的朋友处理竞品数据,她爬了100个商品的页面,里面的价格藏在¥19.99
里,用正则d+.d{2}
一下就提取出了所有价格,直接导入Excel做分析——她之前用字符串分割,得先split(¥
)再split(),老出错,用正则后效率提升了70%。
常用字符串过滤正则表(直接抄)
下面是我整理的“懒人表”,你保存下来,需要的时候直接查:
过滤场景 | 正则表达式 | 说明 | 实战案例 |
---|---|---|---|
过滤特殊字符(留中文/英文/数字) | [^u4e00-u9fa5a-zA-Z0-9] |
匹配非中文、英文、数字的字符 | 清理公众号留言的emoji/火星文 |
去除HTML/XML标签 | ]> |
匹配所有HTML/XML标签(含属性) | 爬虫文章去标签转纯文本 |
提取中国大陆手机号 | 1[3-9]d{9} |
匹配11位符合手机号格式的数字 | 日志中提取用户手机号 |
过滤空格/换行/制表符 | s+ |
匹配所有空白字符(空格、换行、Tab) | 清理文本中的多余空行 |
最后说个小技巧:用在线工具测正则
写完正则别急着用,先去Regex101(https://regex101.com/)测一下——里面能实时看匹配结果,还能解释正则的每一部分是什么意思。我每次写正则都用这个工具,避免出错。比如你写了个过滤特殊字符的正则,把用户留言复制进去,立刻就能看到哪些字符会被匹配到,超方便。
你要是按这些方法试了,比如清理留言、提取数据,欢迎回来告诉我效果——上次有个读者用去除HTML标签的正则处理爬虫内容,说省了他3小时,我听了特开心。要是你有不懂的正则写法,或者遇到奇怪的匹配问题,也可以留言问我,我帮你看看!
其实我之前就踩过误删的坑——去年帮朋友清理爬虫来的文章,想删HTML标签,我一开始写了个<.>
的正则,结果替换完发现整个文章内容都没了!后来查了资料才明白,是“贪婪匹配”,就像饿极了的人见啥吃啥,不管后面有多少个
>
,它都要从第一个<
吃到最后一个>
。比如“
第一段
第二段
”,它会把整个“
第一段
第二段
”都裹进去,一替换就全没了。后来改成]>
才对,这个是“非贪婪”的,像吃自助餐点到为止——只匹配从<
开始到下一个>
为止的内容,比如
会被匹配,
也会被匹配,但中间的“第一段”“第二段”根本碰都不碰,替换完就是“第一段第二段”,完全没误删。
你要是怕出错,还有个超好用的笨办法——先去在线工具测一遍。我现在不管写啥正则,都先打开Regex101,把要处理的内容复制进去,再把正则贴上去,看高亮的部分是不是我要删的。比如之前帮运营清理用户留言,正则是[^u4e00-u9fa5a-zA-Z0-9]
,我把“用户说:今天😊吃了火锅123!”复制进去,高亮的正好是😊和!,就是要删的特殊字符,确认没问题才用到实际内容里,结果一条有效文字都没误删。再比如提取手机号,我写了1[3-9]d{9}
的正则,把“我的电话是13812345678,别打12345678901”复制进去,高亮的只有13812345678——因为12345678901开头不是1[3-9],所以不会被匹配,这样就不会提错号。
还有次帮电商运营提取商品价格,正则是d+.d{2}
,我先把“商品价格:¥19.99,促销价12.50”复制进去,高亮的是19.99和12.50,正好是要的价格,替换完直接导Excel,一点错都没有。你看,其实只要注意“不贪多”(用非贪婪匹配)和“先测试”这两点,误删的概率几乎为零——我现在处理字符串,再也没犯过之前那种全删光的傻事了。
正则表达式看起来好复杂,新手能快速学会吗?
完全可以。新手不用死记所有正则语法,只需聚焦“你要解决的问题”——比如要过滤特殊字符,就记“匹配非中文/英文/数字的正则”;要去HTML标签,就记“匹配的正则”。文中给的“抄作业”表格直接用,再配合Regex101这样的在线工具实时测试,很快就能上手。
用正则过滤字符串时,会不会误删有效内容?
只要注意两个细节就能避免:一是用“非贪婪匹配”(比如用]>而不是<.>),防止匹配范围过大;二是先在在线工具里测试——把要处理的内容复制进去,看正则匹配的部分是不是你要删的,确认没问题再实际使用。比如文中提到的“去HTML标签”,用]*>就不会误删标签外的文字。
除了文中的场景,还有哪些常见需求能用正则解决?
很多高频场景都适合:比如过滤文本中的多余空格(用s+替换成单个空格)、提取URL中的参数(比如从https://xxx.com? id=123里提取id的值)、清理文章中的回车换行(用n+替换成空)、甚至提取身份证号(用d{17}[dXx]匹配18位身份证)。只要是“按格式找内容”的需求,正则都能搞定。
有没有免费的在线工具可以测试正则?
推荐两个常用的:一个是Regex101(https://regex101.com/),支持实时预览匹配结果,还能解释正则的每一部分含义;另一个是“站长工具正则表达式测试”(https://tool.chinaz.com/regex/),适合快速验证简单正则。这两个工具都能帮你避免写正则时出错。