正则表达式学习

正则表达式的概念部分

字符匹配部分

  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})。
  • $ 匹配结束位置,确保整个字符串是符合要求的电话号码格式之一。

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

相关推荐
雨中奔跑的小孩3 小时前
爬虫学习案例3
爬虫·python·学习
冷环渊3 小时前
React基础学习
前端·学习·react.js
今天我又学废了5 小时前
学习记录,隐式对象,隐式类
学习
#HakunaMatata5 小时前
Java 中 List 接口的学习笔记
java·学习·list
Magnetic_h5 小时前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
笔记·学习·ios·objective-c·cocoa
cwtlw7 小时前
CSS学习记录11
前端·css·笔记·学习·其他
cwtlw8 小时前
如何创建maven工程
java·笔记·后端·学习·maven
半夏知半秋9 小时前
unity打包流程整理-Windows/Mac/Linux平台
windows·笔记·学习·macos·unity·游戏引擎
君逸~~9 小时前
RK3568(二)——字符设备驱动开发
linux·驱动开发·笔记·学习·rk3568
Octopus20779 小时前
【C++】AVL树
开发语言·c++·笔记·学习