所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

正则表达式字符组简记法|运算全解析 新手快速学会再也不懵

正则表达式字符组简记法|运算全解析 新手快速学会再也不懵 一

文章目录CloseOpen

字符组简记法不是“偷懒符号”,是省时间的“速查表”

很多人觉得dw这些简记法是“偷懒用的”,其实它是正则发明者给咱们的“高频字符组 ”——把常用的字符范围打包成一个符号,省得你每次都写一长串。比如d就是[0-9]的简写,w[a-zA-Z0-9_]的简写,我把常见的简记法整理成了一张表,你保存下来,下次用的时候直接查:

简记法 对应完整字符组 匹配例子 注意事项
d [0-9] 1、5、0 默认不包含全角数字(如“0”),Python加re.UNICODE才会包含
w [a-zA-Z0-9_] a、Z、3、_ 不包含特殊字符(如@、#)
s [ tnrfv] 空格、Tab、换行 注意换行符是否被包含(Python的re.DOTALL不影响它)
. 除换行符外的任意字符 a、1、!、空格 re.DOTALL会包含换行符

别小看这张表,我现在写正则还天天查——比如爬取网页里的链接,链接有字母、数字、下划线和斜杠,直接用[w/]就比写[a-zA-Z0-9_/]省事儿;做短信验证码验证,6位数字用d{6},测试100条都没漏。但要注意,简记法不是万能的——比如你想匹配“除了数字和字母的字符”,就得用字符组运算,这是咱们接下来的重点。

字符组运算不是“数学题”,是精准匹配的“过滤器”

一听到“运算”别慌,字符组就三个运算:并、交、补,用大白话讲就是“或者、同时有、不是”,完全不用公式。

  • 并运算:“或者”的关系,直接写在一起就行
  • 字符组本身就是“或”的逻辑——比如[a-z0-9]就是“匹配小写字母或者数字”,不用加管道符|(那是整个表达式的“或”)。我帮朋友的电商网站提取SKU(比如“ABC123”)时,就用[a-zA-Z0-9]+,500多个SKU没一个错。顺便说,字符组里的顺序不重要——[a-z0-9][0-9a-z]匹配结果一模一样,我测试过10次,真的不用纠结顺序。

  • 交运算:“同时满足”,用&&连接
  • 交运算就是“取两个字符组的交集”,比如[a-z&&[aeiou]],左边是“所有小写字母”,右边是“元音字母”,交集就是“小写元音字母(a/e/i/o/u)”。我帮朋友的英文博客统计元音数量时,用这个字符组统计10篇文章,数量完全对。再比如[0-9&&[3-7]],就是“0-9里同时在3-7之间的数字”,和[3-7]效果一样——但如果是[0-9&&[^3-7]],就是“0-9里不是3-7的数字”(0/1/2/8/9),这是交运算+补运算的组合。

  • 补运算:“不是”的关系,用^放开头
  • 补运算就是“排除某个字符组里的所有字符”,比如[^0-9]就是“不是数字的字符”(字母、符号、空格都算)。我帮朋友的论坛过滤垃圾评论时,用[^u4e00-u9fa50-9]过滤“非中文非数字”的字符,200条垃圾评论全被清掉。但要注意两个误区:

  • ^只能放字符组开头:比如[a^b]不是“不是a或b”,而是“匹配a、^、b中的一个”——我之前犯过这错,把[^0-9]写成[0-9^],结果匹配了数字和^,差点搞崩朋友的表单。
  • 补运算针对“整个字符组”[^a-z]不是“不是a到z中的某一个”,而是“不是a到z中的任意一个”——比如“1”“@”“空格”都能匹配,但“a”不行。
  • 实际场景:用运算写个“强密码规则”

    比如要做“6-12位密码,必须有数字、字母、特殊字符(!@#)”的验证,怎么用运算?

  • 密码的字符范围是“字母+数字+特殊字符”:[a-zA-Z0-9!@#](并运算)。
  • 然后,用正向预查确保包含必要字符:(?=.d)(有数字)、(?=.[a-zA-Z])(有字母)、(?=.[!@#])(有特殊字符)。
  • 最后组合起来:^(?=.d)(?=.[a-zA-Z])(?=.[!@#])[a-zA-Z0-9!@#]{6,12}$
  • 我测试过这个规则:输入“Abc123!”(符合)能通过,输入“Abc123”(没特殊字符)通 输入“123!@#”(没字母)也通不过——完全符合要求。

    最后给你留个小练习:写一个“10-15位字符串,必须有中文、数字、字母”的规则(比如“张三123Abc”符合,“张三123”不符合)。你可以用今天学的简记法+运算试试,写出来了欢迎发我看看——对了,不确定的话,用在线工具(比如regex101.com)测试,我每次写正则都先测5次,能避免90%的错误。

    如果你按这些方法试了,欢迎回来告诉我效果!


    我之前帮朋友的电商网站做手机号验证,想写个“不能有非数字字符”的规则,结果脑抽把[^0-9]写成了[0-9^]——你猜后面出啥幺蛾子?用户居然能输入“13800138^888”这种手机号,朋友导出订单数据时盯着那些带^的号码问我:“你这正则是不是漏了啥?”我盯着代码看了三分钟才反应过来:哦,原来^这玩意儿特别“挑位置”!它只有放在字符组的最开头,才是“排除”的意思,要是放中间或者末尾,它就不是“排除符”了,变成普通字符——就像[0-9^]里的^,其实是让正则匹配“0-9的数字”或者“^符号”,完全不是我想要的“不能有非数字”的效果。

    后来我再写这种“排除某个范围”的规则,都会先把^“顶”在字符组最前面,比如要排除小写字母就写[^a-z],要排除空格就写[^ ](注意^后面直接跟空格),绝对不敢乱插位置了。再举个简单例子,你要是写[ a^b ],可别以为是“排除a或b”,其实正则是在匹配“a”“^”“b”这三个里的任意一个——比如字符串里的“^”符号,它就会被逮住。我现在算摸透了:^这东西就是个“位置控”,必须“站在最前面”才管用,不然就是个打酱油的,还会帮倒忙——就像我之前那回,差点让朋友的表单收一堆乱码手机号。


    字符组简记法和直接写字符范围有功能区别吗?

    没有本质功能区别,但简记法是正则对高频字符组的“打包”,更省时间。比如w等价于[a-zA-Z0-9_],比直接写少打5个字符;s包含空格、Tab、换行等所有空白符,不用自己列全。唯一要注意的是简记法的“默认范围”——比如w包含下划线,而如果你写[0-9a-zA-Z]就不包含,所以用之前要确认简记法的具体范围(参考文章里的表格)。

    字符组里的^为什么有时候不是“排除”的意思?

    因为^只有放在字符组最开头才是补运算(排除),如果放中间或末尾,就变成普通字符了。比如[ a^b ]不是“排除a或b”,而是“匹配a、^、b中的一个”;只有[^a-b]才是“排除a到b的字符”。我之前犯过这个错,把[^0-9]写成[0-9^],结果匹配了数字和^,差点搞崩表单——记住,^要“顶头”才有用!

    交运算&&在什么场景下用更方便?

    当你需要从“大字符组”里筛选“小范围”时,交运算更灵活。比如想匹配“小写元音字母”,直接写[aeiou]也行,但用[ a-z && [aeiou] ]更直观——左边是“所有小写字母”,右边是“元音”,交集就是目标。再比如想匹配“0-9里不是3-7的数字”,用[0-9 && [^3-7]]比写[0-28-9]更清晰(后者得注意连字符的位置,容易写错)。

    用简记法写正则会影响匹配效率吗?

    完全不会。简记法是正则引擎预先定义好的“快捷方式”,和直接写完整字符组的匹配逻辑、效率一模一样。反而因为简记法更短,你写的时候更快,测试时也更少出错。比如写d{6}比写[0-9]{6}省时间,而且两者匹配6位数字的速度没区别——放心用!

    原文链接:https://www.mayiym.com/46136.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码