游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
字符串过滤正则表达式方法|实用详解|一看就会

正则过滤的核心逻辑:先想“要留什么”,再写规则

我去年帮一个做餐饮外卖的客户处理订单备注,他们的备注里经常有“尽快送达!!!”“不要辣🤬”“加个卤蛋~~”,但后台系统只能识别“汉字、数字、常见标点”,其他字符会导致备注显示乱码。一开始我直接写了个正则[^a-zA-Z0-9u4e00-u9fa5,.!?](匹配不是字母、数字、汉字和常见标点的字符),结果把“🤬”和“~~”都删了,系统就能正常显示了。

这里的关键是:先明确“要保留的内容”,再用“非”规则删掉其他内容——比直接找“要删的内容”更高效,因为你永远不知道用户会输入什么奇怪字符,但“要留的内容”是固定的。

再比如,我帮一个HR朋友提取简历里的邮箱,她一开始用“@”分割字符串,结果有的简历里有多个@(比如“test@163.com@qq.com”),提取出来的邮箱不对。后来我教她用正则[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+,这里的逻辑是:邮箱的结构是“用户名@域名.后缀”,用户名可以是字母、数字、下划线、减号,域名也是一样,后缀可以是.com、.cn之类的。用这个正则匹配,就能准确提取出正确的邮箱了——她试了后说,之前要花2小时处理50份简历,现在10分钟就搞定了。

MDN Web Docs在“正则表达式指南”里提到,“明确匹配目标是写出有效正则的第一步,不要试图用一个正则解决所有问题”——深以为然,我之前就犯过“贪多”的错,想写一个正则处理所有情况,结果反而出错,后来拆成“保留内容”和“提取内容”两个步骤,效率高多了。

3个高频场景的正则模板,直接抄就能用

我整理了自己常用的3个场景模板,都是平时帮朋友处理问题时反复验证过的,你直接复制就能用。

场景1:清理文本里的乱码和不可见字符

我遇到最多的问题就是乱码,比如爬虫爬下来的网页内容,或者用户复制粘贴的文本里有“�”“n”“t”之类的字符。这里有个万能正则:[x00-x1Fx7F-x9F]——解释一下,x00x1F是“控制字符”(比如换行、制表符),x7F是“删除键”字符,x80x9F是“扩展控制字符”,这些字符一般都是不可见的,或者显示成乱码。

比如,我之前爬一个美食博客的内容,爬下来的文本是“番茄鸡蛋汤的做法:n

  • 准备番茄2个�t鸡蛋2个n
  • 番茄去皮切块��”,用这个正则替换后,变成“番茄鸡蛋汤的做法:1. 准备番茄2个鸡蛋2个2. 番茄去皮切块”——是不是干净多了?
  • 场景2:提取指定格式的信息(比如手机号、邮箱)

    提取手机号是最常见的需求,我帮一个做房产中介的朋友处理客户咨询时,他们的咨询里有“138-1234-5678”“139 1234 5678”“13712345678”之类的手机号,要统一提取成11位数字。这里用正则d{3}[

  • ]?d{4}[
  • ]?d{4}
  • ,然后把匹配到的内容里的“-”和“空格”去掉,就能得到11位手机号了。比如匹配“138-1234-5678”,替换掉“-”后就是“13812345678”。

    再比如提取邮箱,用我之前说的[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+,比如匹配“test_123@qq.com”“hello-world@163.com”都没问题。但要注意,这个正则不匹配“中文邮箱”(比如“张三@公司.com”),如果需要处理中文邮箱,可以把用户名部分改成[a-zA-Z0-9_-|u4e00-u9fa5]+(加上汉字)。

    场景3:去掉重复的空格或换行

    我帮一个做文案的朋友处理文章草稿,他习惯用很多空格分隔段落,结果复制到公众号后台后,段落之间有很多空行。这里用两个正则:

  • 去掉重复空格:用 +(注意前面有个空格,匹配两个及以上空格)替换成(一个空格);
  • 去掉重复换行:用n+(匹配两个及以上换行)替换成n(一个换行)。
  • 比如原文本“今天天气不错 阳光很好nnn适合去公园玩”,处理后变成“今天天气不错 阳光很好n适合去公园玩”,排版一下子整齐了。

    为了方便你对照,我做了个模板表:

    场景 正则表达式 说明 示例
    清理乱码 [x00-x1Fx7F-x9F] 匹配不可见控制字符和乱码 原:你好�今天天气不错�� → 处理后:你好今天天气不错
    提取手机号 d{3}[
  • ]?d{4}[
  • ]?d{4}
  • 匹配带分隔符或不带的11位手机号 原:138-1234-5678 → 处理后:13812345678
    去掉重复空格 + 匹配两个及以上空格 原:今天 天气 很好 → 处理后:今天 天气 很好

    其实正则不难,关键是“多试”——我自己写正则的时候,都会用在线工具(比如“正则表达式测试器”)先试一遍,输入原字符串,看看正则匹配的结果对不对。比如我之前写提取邮箱的正则,一开始没加(.[a-zA-Z0-9_-]+)+,结果匹配不了“test@qq.com.cn”这种带两级后缀的邮箱,后来加上后就对了——所以试错很重要,不用怕写错。

    你要是遇到字符串过滤的问题,比如想清理评论里的广告,或者提取数据里的手机号,不妨试试我上面说的方法。要是正则写不对,或者匹配结果有问题,留言告诉我你的场景,我帮你看看怎么调整~


    正则处理中文其实特简单,你记着[u4e00-u9fa5]这串字符就行——它是所有汉字的编码范围,能精准匹配任何中文。我之前帮一个做公众号的朋友处理留言,他的留言区总有粉丝发“今天的文章太棒啦🎉”“求更下期~🤩”,但他想把留言里的表情和乱码删掉,只留中文、数字和常见标点。我就给他写了个正则[^a-zA-Z0-9u4e00-u9fa5,.!?],意思是“不是字母、数字、汉字和,.!?这些标点的字符都删掉”,结果处理后留言变成“今天的文章太棒啦”“求更下期~”,完全符合他的要求。你看,只要把[u4e00-u9fa5]加进“要留的内容”里,中文就不会被误删,比挨个找要删的表情符号高效多了。

    再比如提取中文邮箱,我帮HR朋友筛简历时遇到过——有的候选人写“张三@tech.com”“李四_123@company.cn”,原来的邮箱正则只认字母数字下划线,没法匹配中文用户名,结果提取出来全是空的。后来我把邮箱正则的用户名部分改成[a-zA-Z0-9_-|u4e00-u9fa5],就是在原来的基础上加了[u4e00-u9fa5],这样既能匹配字母数字,也能匹配中文了。她试了一下,“张三@tech.com”直接被精准提取出来,再也不用手动复制邮箱了。不过要注意,有的系统本身不支持中文邮箱,但如果是你自己处理数据,这个方法绝对管用。要是不确定写对没,你可以用在线正则工具测一下,输入“王五@test.com”,看正则能不能匹配上,没错再用,省得出错。


    正则表达式太复杂,有没有快速上手的方法?

    最快的方法是先明确“要保留的内容”——比如想清理订单备注的乱码,就先列出“汉字、数字、常见标点(.?!,)”这些系统能识别的内容,再用“非规则”(比如[^a-zA-Z0-9u4e00-u9fa5,.!?])删掉其他字符。另外可以用在线正则测试工具(比如“正则表达式测试器”),输入原字符串和规则,实时看匹配结果,不用死记所有语法,边试边调更高效。

    正则怎么处理中文相关的字符串过滤?

    处理中文时,用[u4e00-u9fa5]可以精准匹配所有汉字——比如想保留备注里的中文,就把这个范围加进“要留的内容”;如果是提取中文邮箱(比如“张三@公司.com”),可以把邮箱正则的用户名部分改成[a-zA-Z0-9_-|u4e00-u9fa5],这样就能匹配带汉字的用户名了。

    正则匹配结果不对,应该怎么调整?

    先找在线工具(比如“正则表达式测试器”)验证——把原字符串和正则规则输进去,看到底匹配了哪些内容。比如想提取邮箱却匹配到了多个@的错误内容,可能是没限制“后缀的格式”,这时可以加上(.[a-zA-Z0-9_-]+)+来约束后缀(比如.com.cn)。另外别贪多,一个正则解决一个问题,分步处理(比如先清理乱码再提取邮箱)更准确。

    怎么用正则提取带-或空格的手机号?

    用正则d{3}[

  • ]?d{4}[
  • ]?d{4}就能匹配——其中[- ]?表示“可选的-或空格”,能覆盖“138-1234-5678”“139 1234 5678”这类带分隔符的手机号。匹配后再把结果里的-或空格删掉(比如用替换功能把“-”和“ ”换成空字符串),就能得到11位纯数字的手机号了。