正则表达式学习

正则表达式的概念部分

字符匹配部分

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

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

相关推荐
charlie1145141912 分钟前
Linux内核深入学习(4)——内核常见的数据结构之链表
linux·数据结构·学习·链表·内核
海尔辛2 小时前
学习黑客了解密码学
学习·密码学
ShallowLin4 小时前
HarmonyOS学习——UIAbility组件(下)
学习
.小墨迹4 小时前
Python学习——执行python时,键盘按下ctrl+c,退出程序
linux·开发语言·python·学习·自动驾驶
蓝婷儿4 小时前
6个月Python学习计划 Day 1
开发语言·python·学习
@codercjw6 小时前
齿轮,链轮,同步轮,丝杆传动sw画法
学习
东京老树根7 小时前
SAP学习笔记 - 开发13 - CAP 之 添加数据库支持(Sqlite)
笔记·学习
编程版小新8 小时前
封装红黑树实现mymap和myset
c++·学习·set·map·红黑树·红黑树封装set和map·红黑树封装
百锦再8 小时前
微信小程序学习基础:从入门到精通
前端·vue.js·python·学习·微信小程序·小程序·pdf
虾球xz8 小时前
游戏引擎学习第301天:使用精灵边界进行排序
学习·算法·游戏引擎