

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
本文聚焦实战,梳理字符串过滤的正则常用方法:从精准匹配特定字符(比如只保留数字或字母)、快速剔除无用内容(比如过滤乱码、广告字符),到高效提取关键信息(比如从文本中抓出邮箱、订单号),每一种方法都结合真实场景拆解,帮你避开“写不对、用不好”的误区。不管是新手想入门,还是老手想补漏,这些技巧都能让你从“会用正则”变“用对正则”,直接解决字符串过滤的核心问题,提升处理效率。
你肯定遇到过这种情况:想从用户评论里提取手机号,结果抓了一堆“123456”这种无关数字;想清理电商订单里的乱码,却把正经的商品名称也删了;甚至写个简单的表单验证,比如“只能输入中文”,结果连“张三”都通过不了——其实不是正则表达式难,是你没摸透它的“脾气”:它不是堆符号的“密码”,而是帮你“精准筛选”字符串的工具,关键是要把“需求说清楚”。
正则过滤的核心逻辑:先想“要什么”“不要什么”,再写代码
去年我帮做电商运营的朋友处理用户留言数据,他要从1000多条评论里提取有效的手机号,用来做老客回访。结果一开始他用d+
(匹配所有数字),抓出来的要么是“138-XXXX-1234”里的“138”“XXXX”“1234”(拆成了三段),要么是“我的手机号是139XXXX5678,微信号同号”里的“139XXXX5678”(这个对),但还有“123456”这种订单号也混进去了。
我问他:“你到底要什么样的手机号?”他想了想说:“11位数字,可能带横线分隔符,但整体是手机号,不是短数字。”哦,原来问题出在“需求没明确”——他之前只说“要数字”,但没说“要11位、带可选分隔符的数字”。
后来我帮他改了正则:^d{3}[-]?d{4}[-]?d{4}$
。你看,这个正则其实就是把他的需求“翻译”成符号:
d{3}
:前三位数字(比如“138”);[-]?
:可选的横线分隔符(“?”表示“0次或1次”,所以带不带横线都能匹配);d{4}
:中间四位(比如“XXXX”);[-]?
和d{4}
(最后四位);$
:字符串 (避免后面有其他字符)。改完后,不仅“138-XXXX-1234”“139XXXX5678”都能抓到,连“150XXXX1234”这种不带分隔符的也没问题,而且“123456”这种短数字直接被过滤掉了——因为它不符合“11位”的要求。
你看,正则的核心从来不是“记住多少符号”,而是“先明确需求,再把需求转化为模式”。MDN Web Docs(Mozilla的官方文档,做前端的都知道)里也说:“正则表达式的力量在于精确性,但前提是你能正确描述需求”(参考链接:MDN正则指南)。
实战中最常用的3类正则过滤技巧:直接能用的模板+避坑指南
我整理了过去3年帮朋友、客户解决字符串过滤问题的经验,发现90%的需求都能归成3类:保留特定字符“只留我要的”、剔除无用内容“删掉我不要的”、提取关键信息“抓出核心内容”。每类都有直接能用的模板,还有我踩过的坑——帮你省时间。
这类需求最常见:比如清理用户昵称(只留中文+字母)、提取订单号(只留数字)、整理地址(只留中文+数字)。
比如我之前帮自媒体朋友做粉丝留言分析,要从“用户现在需要解决的问题是:正则怎么匹配中文?🤔我也遇到过同样的问题,后来问了程序员朋友才知道用[u4e00-u9fa5]”里提取纯中文。我用的正则是[u4e00-u9fa5]+
——[u4e00-u9fa5]
是中文的Unicode编码范围,“+”表示“1次或多次”,所以能提取所有连续的中文字符。
结果提取出来的是“用户现在需要解决的问题是正则怎么匹配中文我也遇到过同样的问题后来问了程序员朋友才知道用”——完全过滤掉了表情、问号和英文。但朋友说:“能不能保留标点?比如‘,。!’,不然读起来不通顺。”我就把正则改成[u4e00-u9fa5,。!?;]+
——把需要保留的标点加进字符集里就行。
避坑提示:别用^[u4e00-u9fa5]+$
(前面加、后面加$
),因为这表示“整个字符串都是中文”。如果留言是“我的问题是:正则怎么匹配中文?”,里面有“:”和“?”,用这个正则就会匹配失败——你要的是“提取所有中文和标点”,不是“整行都是中文”,所以不用加和$
。
电商、自媒体、HR这三类人最需要这个技巧——比如电商导出的订单数据里有“【促销价】”“满200减50”这种广告,HR的简历里有“📌求职意向:运营”这种表情,自媒体评论里有“★★★好评”这种符号。
比如我帮HR朋友处理简历时,要过滤掉所有表情和特殊符号,只留文字。我用的正则是[^a-zA-Z0-9u4e00-u9fa5,。!?]
——这里的在字符集里表示“非”,意思是“匹配所有不是字母、数字、中文、常用标点的字符”。然后用替换功能(比如Python里的re.sub()
),把这些字符换成空字符串,就能得到干净的文字。
再比如,朋友的美食博客评论里有很多“【吃了这家店,我连吃三天!】”这种带方括号的广告,要过滤掉方括号里的内容,我用的正则是【.?】
——.?
是“非贪婪匹配”,意思是“尽可能少地匹配字符”。比如“【促销】满200减50【好评】”,用【.?】
会匹配“【促销】”和“【好评】”(分开匹配),而用【.】
(贪婪匹配)会匹配“【促销】满200减50【好评】”(把中间的内容也包含进去),这样就会误删很多有用的内容。
避坑提示:如果要过滤的内容有“嵌套”,比如“【推荐【这家店】的红烧肉】”,正则可能处理不了——因为【.?】
会匹配“【推荐【这家店】”(第一个【
到第一个】
),剩下的“的红烧肉】”还在。这种情况需要用更复杂的正则,但一般日常场景里很少遇到,实在遇到了可以分两次过滤:先过滤外层的【.?】
,再过滤内层的。
这类需求是“正则的终极用处”——从一堆文本里抓出你要的“关键数据”。比如我帮做新媒体的朋友提取粉丝留言里的邮箱,用来发福利;帮会计朋友提取发票里的日期,用来做记账。
比如提取邮箱,我用的正则是[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+
。你看,这个正则覆盖了大部分常用邮箱格式:
[a-zA-Z0-9_-]+
:用户名(比如“abc123”“def_-ghi”);@
:必备的“@”符号;[a-zA-Z0-9_-]+
:域名(比如“qq”“163”);(.[a-zA-Z0-9_-]+)+
:顶级域名(比如“.com”“.cn”“.com.cn”,“+”表示“1次或多次”,所以多级域名也能匹配)。之前我用.@.
(匹配所有带@
的字符串),结果抓了很多错误邮箱,比如“abc@def@ghi.com”(重复@
)、“abc@.com”(域名空),改用上面的正则后,这些错误都过滤掉了——因为[a-zA-Z0-9_-]+
要求用户名和域名都有内容,(.[a-zA-Z0-9_-]+)+
要求顶级域名至少有一个(比如“.com”)。
避坑提示:别用^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
——如果邮箱是“我的邮箱是abc@qq.com”,前面有“我的邮箱是”,用这个正则就会匹配失败。你要的是“提取文本中的邮箱”,不是“整行都是邮箱”,所以不用加和$
。
常用正则过滤模板表:直接复制就能用
我把日常用得最多的正则整理成了表格,你可以直接复制用——记得根据自己的需求调整哦!
使用场景 | 正则表达式 | 说明 | 避坑提示 |
---|---|---|---|
提取11位手机号(含分隔符) | ^d{3}[-]?d{4}[-]?d{4}$ | 匹配带/不带横线的11位手机号 | 别漏和$ ,否则会匹配到超长数字 |
保留中文+常用标点 | [u4e00-u9fa5,。!?;:]+ | 提取所有中文和常见标点 | 要加更多标点,手动添字符集里 |
过滤所有特殊符号(留文字) | [^a-zA-Z0-9u4e00-u9fa5,。!?] | 匹配非字母、数字、中文、标点的字符 | 要留空格,加进字符集(比如[^… ]) |
提取邮箱(通用格式) | [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+ | 匹配大部分常用邮箱 | 别加和$ ,否则会漏带前缀的邮箱 |
其实正则真的不难,我一开始学的时候也觉得“这符号怎么这么乱”,但用多了发现:它就是“把你的需求翻译成机器能懂的语言”。比如你要“提取11位手机号”,就写“11位数字、带可选分隔符”;你要“过滤特殊符号”,就写“匹配所有不是文字的字符”。
你要是遇到具体的问题,比如“想提取快递单号”“想过滤朋友圈的广告”,可以在评论区说——我帮你想想正则怎么写!
你是不是也遇到过这种情况?从网上找了个邮箱正则,复制过来用,结果明明文本里有“我的邮箱是abc@qq.com”“联系我:def@163.com”这种一眼就能看出来的正确邮箱,却压根提取不出来——反复核对正则里的符号,字母、下划线、@、点号都没写错啊?其实问题就出在你复制的正则里多了两个“小尾巴”:^和$。
我跟你掰扯明白这俩符号的意思啊——^是“字符串开头”,$是“字符串 ”,加了这俩,正则就像被上了“紧箍咒”:必须整行内容从第一个字到最后一个字,完完全全是个标准邮箱才行。可咱实际用的时候,谁会把邮箱单独发一行啊?肯定是带点前缀的,比如“我的邮箱是”“有事发邮箱:”,甚至后面还跟着“(工作时间会回复)”这种后缀。这时候带^$的正则就会“认死理”——“这行开头不是邮箱, 也不是,我不认识它”,自然就把这些带前缀后缀的邮箱全过滤掉了。
我之前帮做自媒体的朋友处理粉丝留言,他要从100多条评论里提取邮箱发福利,一开始用的就是网上找的带^$的正则:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$,结果倒好,100条评论里只抓到3个“纯邮箱行”(就是那种单独发一行“abc@qq.com”的),剩下的全漏了——比如“想要资料的话发邮件到ghi@outlook.com哦”“我的邮箱是jkl@126.com,麻烦尽快联系”这种,全没提取出来。后来我让他把^和$去掉,用通用的邮箱正则:[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+,你猜怎么着?一下子就抓到了20多个邮箱,连那些藏在句子中间的都没漏掉。
其实正则这东西没那么“高冷”,它就是个“帮你找东西的工具”——你要的是“从文本里捞邮箱”,不是“给邮箱做‘纯不纯洁’的体检”,所以别用^和$把自己的路堵死。去掉这俩符号,正则就像撒了张灵活的网,能把文本里藏着的邮箱都捞出来,再也不会漏掉那些带点前缀后缀的正确邮箱啦。
正则里的^和$到底什么时候用?
正则里的^表示“字符串开头”,$表示“字符串 ”,主要用于验证整行内容是否完全符合规则(比如验证手机号格式时,用^d{3}[-]?d{4}[-]?d{4}$,确保整行都是11位带可选分隔符的手机号);如果是从文本中提取内容(比如从评论里找邮箱),就不需要加^和$,否则会漏掉前面有前缀的内容(比如“我的邮箱是abc@qq.com”里的邮箱)。
为什么我用正则提取手机号总是抓错无关数字?
主要是因为需求没明确——如果只用d+匹配所有数字,会把短数字(如订单号123456)或拆分的手机号段(如138-XXXX-1234里的138)也抓进来。解决方法是把需求“翻译”成正则:比如要11位带可选分隔符的手机号,用^d{3}[-]?d{4}[-]?d{4}$,既限定了长度,又允许分隔符,还能用^$确保整行都是手机号,避免无关数字混入。
过滤特殊符号时,想保留空格怎么办?
文章里过滤特殊符号的正则是[^a-zA-Z0-9u4e00-u9fa5,。!?](匹配非文字、数字、常用标点的字符),如果想保留空格,只需在字符集里加一个空格即可,比如改成[^a-zA-Z0-9u4e00-u9fa5,。!? ]——这样空格就会被归为“不需要过滤的字符”,不会被替换成空字符串。
提取邮箱时,为什么有些正确邮箱匹配不到?
常见原因是误加了^和$——如果你的正则是^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$,会要求整行都是邮箱,但实际文本里邮箱可能带前缀(比如“我的邮箱是abc@qq.com”),导致匹配失败。解决方法是去掉^和$,用通用邮箱正则:[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+,就能提取文本中的邮箱了。
正则里的.?和.有什么区别?
.是“贪婪匹配”,会尽可能多的匹配字符(比如“【促销】满200减50【好评】”,用.会从第一个【匹配到最后一个】,把中间内容都包含进去);.?是“非贪婪匹配”,会尽可能少的匹配字符(同样的例子,用.?会分别匹配“【促销】”和“【好评】”)。过滤广告、提取嵌套内容时, 用.*?避免误删有用信息。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com