正则表达式学习

正则表达式的概念部分

字符匹配部分

  1. "."(点)

    可以把它想象成一个"万能填空符",不过这个填空符只能填一个字符哦,除了换行符之外,啥字符都行。比如说你想找一个字符串里不管是字母、数字还是其他符号,只要是单个的,用"."就能试着去匹配啦。像"a.c",那它就能匹配"abc""a1c""a&c"等等,只要中间是单个字符就行。

  2. "^"

    这就好比是起跑线呀,专门用来确定从整个字符串最开头的地方开始匹配规则。比如说你写了个正则表达式"^abc",那它就只会去看这个字符串一开始是不是"abc",要是前面还有别的字符,那就不符合要求了。

  3. **" " ∗ ∗ :这个刚好和 " " 相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如" a b c "**: 这个刚好和"^"相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如"abc "∗∗:这个刚好和""相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如"abc",那意味着整个字符串到结尾的时候得是"abc",后面不能再有多余的字符了,要是后面还有别的内容,就匹配不上了。

  4. "[abc]"

    就像给几个候选人投票一样,这里面的"a""b""c"就是候选人,这个表达式的意思就是只要出现"a"或者"b"或者"c"其中一个,就算匹配上啦。比如说"[abc]d",那"ad""bd""cd"这些字符串都能符合这个规则。

  5. "[^abc]"

    这和上面相反,它是说除了"a""b""c"这几个之外的其他字符都行,就好像排除了这几个特定的人,剩下的人都能当选一样。比如"[^abc]d",那"1d""xd"(只要不是"a""b""c"开头接着"d"的)都能匹配上。

  6. "\d"

    简单来说,它就是数字的小侦探,只要是0到9这些数字,它都能发现并且匹配上。像"\d\d",就能匹配"12""34"这些两位数字组成的字符串啦。

  7. "\D"

    那这个就是专门找那些不是数字的角色啦,比如字母、标点符号啥的,只要不是0到9的数字就行。要是写个"\D\D",像"ab""##"这样的字符串就能符合它的匹配规则了。

  8. "\w"

    这个就好像是一个大圈子,把字母(不管大小写)、数字还有下划线这些都圈进去了,只要字符串里出现这些里面的角色,它就能匹配。比如"\w\w","a1""_b"这些都能匹配上哦,因为都在它圈定的范围里。

  9. "\W"

    刚好和"\w"相反啦,它是去找那些不在这个圈子里的,也就是那些既不是字母、也不是数字、还不是下划线的字符,像标点符号、空格之类的,要是写"\W\W",那"##"" "(空格空格)这样的就能匹配上了。

量词部分

  1. "*"

    你可以把它想成一个很随和的符号,前面的东西可以出现0次或者很多次都行。比如说"a*",那像空字符串(啥都没有也算哦,因为出现0次嘛)、"a""aa""aaa"等等这些,它都能匹配,反正只要是"a"出现任意次数或者干脆不出现,都符合要求。

  2. "+"

    这个就稍微有点要求啦,前面的东西至少得出现1次,多了也没关系。比如"a+",那像"a""aa""aaa"能匹配,但空字符串就不行了,因为它要求至少有1个"a"才行呀。

  3. "?"

    就有点像"可有可无"的意思,前面的东西要么出现1次,要么就干脆不出现。像"a?",那它能匹配空字符串,也能匹配"a",但是"aa"就不符合啦,因为它只能允许"a"出现0次或者1次。

  4. "{n}"

    这就是很精确的啦,规定前面的东西必须不多不少出现"n"次。比如"a{3}",那就只能匹配"aaa",其他的像"a""aa""aaaa"都不符合要求哦,必须刚好是3个"a"。

  5. "{n,}"

    意思是前面的东西至少得出现"n"次,多了无所谓。像"a{2,}",那"aa""aaa""aaaa"这些都能匹配,反正只要"a"出现的次数大于等于2次就行啦。

  6. "{n,m}"

    这个是限定了一个范围,前面的东西最少得出现"n"次,但是最多不能超过"m"次。比如说"a{2,4}","aa""aaa""aaaa"能匹配,但是"a"就不行(因为少于2次),"aaaaa"也不行(因为超过4次)啦。

分组和捕获部分

"(...)"

可以把它想象成是给一些字符打包啦,把括号里的那些当作一组,而且这个组还能记住里面的内容呢,后面要是想用这里面匹配到的内容,还能通过特殊的办法(像"\1"这种反向引用)把它找出来再用哦。比如说"(abc)\1",前面括号里匹配到"abc"了,后面的"\1"就是说要再出现一次前面匹配到的"abc",那像"abcabc"这样的字符串就能匹配上啦。

选择和逻辑或部分

"|"

就好比是摆在面前的几条路,只要符合其中一条路的规则就行啦。比如说"abc|def",那字符串是"abc"或者是"def"的时候就能匹配上,就像只要走对这两条路里的任意一条就可以了呀。

特殊字符的转义部分

"\"(反斜杠)

有些字符本来有特殊的含义,就像咱前面说的".""*"这些,要是你不想让它们发挥特殊作用了,只想用它们本来的样子,比如就是想找一个实实在在的点,那就在前面加个反斜杠,写成".",这样它就只是表示那个普通的点字符啦,而不是那个能匹配任意单个字符的"."了哦。

断言部分

  1. "?=..."(正向前瞻断言)

    可以把它想象成是在偷偷看前面的情况哦,它是看某个位置前面是不是符合后面写的那些规则,但是这个符合规则的部分不会算到真正匹配的结果里去。比如说"a(?=b)",它就是去找"a",而且这个"a"后面得紧接着是"b"才行,不过找到的这个"a"是匹配上了,但后面的"b"不算在最终匹配结果里哦,像"ab"这个字符串里的"a"就能被它发现符合规则。

  2. "?!.."(负向前瞻断言)

    和上面类似,也是看前面的情况,不过它是要求前面那个位置不能符合后面写的规则。比如"a(?!b)",就是找"a",但这个"a"后面不能跟着"b",要是"ac"这样的字符串,里面的"a"就符合它的规则啦。

  3. "?<=..."(正向后瞻断言)

    这个是看后面的情况啦,看某个位置后面是不是符合前面写的那些规则,同样符合规则的那部分也不算在最终匹配结果里哦。像"(?<=a)b",就是去找"b",而且这个"b"前面得是"a",像"ab"里的"b"就能被它匹配上,不过前面的"a"不算在匹配成果里呀。

  4. "?<!.."(负向后瞻断言)

    也是看后面情况,要求后面不能符合前面写的规则。比如"(?<!a)b",就是找"b",但这个"b"前面不能是"a",要是"cb"这样的字符串,里面的"b"就符合它的规则了。

反向引用部分

"\1"、"\2"等

还记得前面说的分组"(...)"能记住里面的内容不?这些"\1""\2"就是去把之前记住的内容拿出来再用呀。"\1"就是拿第一个括号分组里匹配到的内容,"\2"就是拿第二个括号分组里匹配到的内容,依此类推。比如说"(a)(b)\1\2",前面两个括号分别匹配到"a"和"b"了,后面的"\1"就是"a","\2"就是"b",那像"abab"这样的字符串就能匹配上啦。

注释部分

"(?#...)"

这个就和咱们平时写代码加注释一样呀,在正则表达式里写上它,里面写的那些内容就是给咱自己看的,用来解释一下这个正则表达式是干嘛的、有啥规则啥的,但是它不会影响正则表达式实际去匹配字符串哦,就纯粹是方便咱们自己理解的备注啦。

总之,正则表达式虽然一开始看着有点复杂,但熟悉了这些规则之后,就能在处理各种文本的时候特别方便,快速找到咱们想要的那些字符串或者对它们进行替换之类的操作啦。

正则表达式的应用

国内手机号码

(简单匹配,只考虑常见的11位数字格式,目前国内手机号段开头有13、14、15、16、17、18、19等):

regex 复制代码
^1[3-9]\d{9}$

解释:

  • ^ 表示匹配字符串的开始位置。
  • 1 表示手机号码以1开头。
  • [3-9] 限定第二位数字的范围是3到9之间,符合常见的手机号段开头情况。
  • \d{9} 表示后面接着9位数字,\d 代表数字,{9} 表示前面的字符(这里就是数字)出现9次。
  • $ 表示匹配字符串的结束位置,确保整个字符串就是符合规则的手机号码格式,没有多余的其他字符。

包含区号的固定电话号码

(简单示例,假设区号3到4位,电话号码7到8位,区号和电话号码之间用"-"连接,比如010-12345678这种格式):

regex 复制代码
^0\d{2,3}-\d{7,8}$

解释:

  • ^ 匹配开始位置。
  • 0 表示区号以0开头,这是国内区号的常见开头情况。
  • \d{2,3} 表示区号部分是2到3位数字,例如010、021等常见区号格式。
  • - 就是实际电话号码中区号和号码之间的连接符,在正则表达式里就按原样匹配这个字符。
  • \d{7,8} 表示后面的电话号码部分是7到8位数字,像常见的本地电话号码位数情况。
  • $ 匹配结束位置,保证整个字符串符合固定电话的格式要求。

更宽松一些的电话号码匹配

(可以匹配手机号码或者包含区号的固定电话等多种格式,只是简单将常见格式合并,实际应用中可能还需更细致完善):

regex 复制代码
^(1[3-9]\d{9}|0\d{2,3}-\d{7,8})$

解释:

  • ^ 开始位置匹配。
  • (1[3-9]\d{9}|0\d{2,3}-\d{7,8}) 这里使用了分组和"或"(| 符号表示或的关系)的概念,整体意思是要么匹配前面括号里的手机号码格式(1[3-9]\d{9}),要么匹配后面括号里的固定电话格式(0\d{2,3}-\d{7,8})。
  • $ 匹配结束位置,确保整个字符串是符合要求的电话号码格式之一。

请注意,电话号码的格式在不同国家、地区以及具体业务场景下会有各种变化和特殊要求,上述正则表达式只是比较基础和常见的示例,实际运用时可能需要根据具体情况进一步调整和完善。

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习