参考文档:
http://blog.csdn.net/spch2008/article/details/50574059
http://www.runoob.com/java/java-regular-expressions.html
现有一个无敌坑的正则表达式如下:
/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$|^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$/
只记得正则表达式看过好几次,但是由于使用的太少,导致看一次忘一次,所以这一次,通过这个对我来说难度上天的表达式,简单的记录一下学习过程。
这个正则表达式,本来是项目中用来校验输入的支付宝账号格式用的,因为支付宝账号有两种:手机号和邮箱。
分析正则
-
开头和结尾的 / 符号
这个符号很可能是前端从哪个js或者字符串中拷贝出来,在这里应该不带任何意义。应该去掉。 -
通过 | 竖线来拆分正则
原正则:
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$|^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$
拆分后:
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$ //匹配邮箱
|
^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$ //匹配手机号
- 单个击破
3.1 邮箱的正则
^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$
^ 表示以...开头。 这里表示以(\w-*\.*)+开头。
(\w-*\.*)+ 表示一个或多个(字符串+零或多个减号+零或多个点)
满足(\w-*\.*)+的字符串有:
service-----service----xxx......
service-----service----xxx
service-----
123service-----
@ 表示邮箱的@符号
(\w-?)+ 表示一个或多个(字符串+零或一个减号)
(\.\w{2,})+ 表示一个或多个(点+至少两个字符)
$ 表示(在这)必须以(\.\w{2,})+结尾
3.2 手机号的正则
^(?:13\d|15\d|18\d)-?\d{5}(\d{3}|\*{3})$
^ 表示以...开头。 这里表示以(13或15或18+一个数字)开头。
(?:13\d|15\d|18\d) 表示(13或15或18+一个数字),关于?:请看特殊规则
-? 表示零个或一个减号(这点,作为手机号的正则就让人无法理解)
\d{5} 表示5个数字
(\d{3}|\*{3}) 表示3个数字或三个*(脱敏),这个脱敏规则也很奇怪
$ 表示(在这)必须以3个数字或三个*结尾
特殊规则
- ^ 和 $
^符号表示以什么开头,$符号表示以什么结尾
举例:
^\d+$ 只能匹配数字开口,数字结尾的表达式;
\d+$ 只要结尾是数字,就可以匹配;
^\d+ 只要开头是数字,就可以匹配;
- ?:
这与反向引用有关,先简单介绍一下什么是后向引用。
一个稍复杂的正则表达式,可能由多个()组成,()中有各种简单的正则表达式,举一个例子:
(\d+),(\w),(\d+) //表达式一: 三个可被捕获的表达式
(?:\d+),(?:\w),(\d+) //表达式二:一个可被捕获的表达式
如表达式一,三个括号可以理解成三个变量,用\1 \2 \3依次表示(\d+) 和 (\w) 和 (\d+)。
如果我要通过grep的正则来搜索:
grep -P "(\d+),(\w),\1," --color log.txt
通过\1可以获取(\d+)
- 贪婪和懒惰 ?
正则表达式,默认情况下都是“贪婪”,当"?"紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“懒惰”。
“懒惰”模式匹配搜索到的、尽可能短的字符串,而默认的“贪婪”模式匹配搜索到的、尽可能长的字符串。举例说明:
表达式 | 含义 |
---|---|
*? | 重复零次或多次,但尽可能少 |
+? | 重复一次或多次,但尽可能少 |
?? | 重复0次或1次,但尽可能少 |
{n}? | 重复n次,但尽可能少 |
{n,}? | 重复至少n次,但尽可能少 |
{n,m}? | 重复n到m次,但尽可能少 |
网友评论