正则表达式的概念部分
字符匹配部分
-
"."(点) :
可以把它想象成一个"万能填空符",不过这个填空符只能填一个字符哦,除了换行符之外,啥字符都行。比如说你想找一个字符串里不管是字母、数字还是其他符号,只要是单个的,用"."就能试着去匹配啦。像"a.c",那它就能匹配"abc""a1c""a&c"等等,只要中间是单个字符就行。
-
"^" :
这就好比是起跑线呀,专门用来确定从整个字符串最开头的地方开始匹配规则。比如说你写了个正则表达式"^abc",那它就只会去看这个字符串一开始是不是"abc",要是前面还有别的字符,那就不符合要求了。
-
**" " ∗ ∗ :这个刚好和 " " 相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如" a b c "**: 这个刚好和"^"相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如"abc "∗∗:这个刚好和""相反,相当于终点线啦,是用来检查字符串最后是不是符合咱定的规则。比如"abc",那意味着整个字符串到结尾的时候得是"abc",后面不能再有多余的字符了,要是后面还有别的内容,就匹配不上了。
-
"[abc]" :
就像给几个候选人投票一样,这里面的"a""b""c"就是候选人,这个表达式的意思就是只要出现"a"或者"b"或者"c"其中一个,就算匹配上啦。比如说"[abc]d",那"ad""bd""cd"这些字符串都能符合这个规则。
-
"[^abc]" :
这和上面相反,它是说除了"a""b""c"这几个之外的其他字符都行,就好像排除了这几个特定的人,剩下的人都能当选一样。比如"[^abc]d",那"1d""xd"(只要不是"a""b""c"开头接着"d"的)都能匹配上。
-
"\d" :
简单来说,它就是数字的小侦探,只要是0到9这些数字,它都能发现并且匹配上。像"\d\d",就能匹配"12""34"这些两位数字组成的字符串啦。
-
"\D" :
那这个就是专门找那些不是数字的角色啦,比如字母、标点符号啥的,只要不是0到9的数字就行。要是写个"\D\D",像"ab""##"这样的字符串就能符合它的匹配规则了。
-
"\w" :
这个就好像是一个大圈子,把字母(不管大小写)、数字还有下划线这些都圈进去了,只要字符串里出现这些里面的角色,它就能匹配。比如"\w\w","a1""_b"这些都能匹配上哦,因为都在它圈定的范围里。
-
"\W" :
刚好和"\w"相反啦,它是去找那些不在这个圈子里的,也就是那些既不是字母、也不是数字、还不是下划线的字符,像标点符号、空格之类的,要是写"\W\W",那"##"" "(空格空格)这样的就能匹配上了。
量词部分
-
"*" :
你可以把它想成一个很随和的符号,前面的东西可以出现0次或者很多次都行。比如说"a*",那像空字符串(啥都没有也算哦,因为出现0次嘛)、"a""aa""aaa"等等这些,它都能匹配,反正只要是"a"出现任意次数或者干脆不出现,都符合要求。
-
"+" :
这个就稍微有点要求啦,前面的东西至少得出现1次,多了也没关系。比如"a+",那像"a""aa""aaa"能匹配,但空字符串就不行了,因为它要求至少有1个"a"才行呀。
-
"?" :
就有点像"可有可无"的意思,前面的东西要么出现1次,要么就干脆不出现。像"a?",那它能匹配空字符串,也能匹配"a",但是"aa"就不符合啦,因为它只能允许"a"出现0次或者1次。
-
"{n}" :
这就是很精确的啦,规定前面的东西必须不多不少出现"n"次。比如"a{3}",那就只能匹配"aaa",其他的像"a""aa""aaaa"都不符合要求哦,必须刚好是3个"a"。
-
"{n,}" :
意思是前面的东西至少得出现"n"次,多了无所谓。像"a{2,}",那"aa""aaa""aaaa"这些都能匹配,反正只要"a"出现的次数大于等于2次就行啦。
-
"{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"的时候就能匹配上,就像只要走对这两条路里的任意一条就可以了呀。
特殊字符的转义部分
"\"(反斜杠) :
有些字符本来有特殊的含义,就像咱前面说的".""*"这些,要是你不想让它们发挥特殊作用了,只想用它们本来的样子,比如就是想找一个实实在在的点,那就在前面加个反斜杠,写成".",这样它就只是表示那个普通的点字符啦,而不是那个能匹配任意单个字符的"."了哦。
断言部分
-
"?=..."(正向前瞻断言) :
可以把它想象成是在偷偷看前面的情况哦,它是看某个位置前面是不是符合后面写的那些规则,但是这个符合规则的部分不会算到真正匹配的结果里去。比如说"a(?=b)",它就是去找"a",而且这个"a"后面得紧接着是"b"才行,不过找到的这个"a"是匹配上了,但后面的"b"不算在最终匹配结果里哦,像"ab"这个字符串里的"a"就能被它发现符合规则。
-
"?!.."(负向前瞻断言) :
和上面类似,也是看前面的情况,不过它是要求前面那个位置不能符合后面写的规则。比如"a(?!b)",就是找"a",但这个"a"后面不能跟着"b",要是"ac"这样的字符串,里面的"a"就符合它的规则啦。
-
"?<=..."(正向后瞻断言) :
这个是看后面的情况啦,看某个位置后面是不是符合前面写的那些规则,同样符合规则的那部分也不算在最终匹配结果里哦。像"(?<=a)b",就是去找"b",而且这个"b"前面得是"a",像"ab"里的"b"就能被它匹配上,不过前面的"a"不算在匹配成果里呀。
-
"?<!.."(负向后瞻断言) :
也是看后面情况,要求后面不能符合前面写的规则。比如"(?<!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}
)。$
匹配结束位置,确保整个字符串是符合要求的电话号码格式之一。
请注意,电话号码的格式在不同国家、地区以及具体业务场景下会有各种变化和特殊要求,上述正则表达式只是比较基础和常见的示例,实际运用时可能需要根据具体情况进一步调整和完善。