正则表达式

参考文档:
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})$/

只记得正则表达式看过好几次,但是由于使用的太少,导致看一次忘一次,所以这一次,通过这个对我来说难度上天的表达式,简单的记录一下学习过程。

这个正则表达式,本来是项目中用来校验输入的支付宝账号格式用的,因为支付宝账号有两种:手机号和邮箱。

分析正则

  1. 开头和结尾的 / 符号
    这个符号很可能是前端从哪个js或者字符串中拷贝出来,在这里应该不带任何意义。应该去掉。

  2. 通过 | 竖线来拆分正则

原正则:
^(\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})$   //匹配手机号
  1. 单个击破
    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个数字或三个*结尾

特殊规则

  1. ^ 和 $
  ^符号表示以什么开头,$符号表示以什么结尾
  举例:
  ^\d+$  只能匹配数字开口,数字结尾的表达式;
  \d+$   只要结尾是数字,就可以匹配;
  ^\d+   只要开头是数字,就可以匹配;
  1. ?:
这与反向引用有关,先简单介绍一下什么是后向引用。
一个稍复杂的正则表达式,可能由多个()组成,()中有各种简单的正则表达式,举一个例子:
(\d+),(\w),(\d+)   //表达式一: 三个可被捕获的表达式
(?:\d+),(?:\w),(\d+)   //表达式二:一个可被捕获的表达式

如表达式一,三个括号可以理解成三个变量,用\1 \2 \3依次表示(\d+) 和 (\w) 和 (\d+)。

如果我要通过grep的正则来搜索:
grep -P "(\d+),(\w),\1," --color log.txt
通过\1可以获取(\d+)
  1. 贪婪和懒惰 ?
    正则表达式,默认情况下都是“贪婪”,当"?"紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“懒惰”。
    “懒惰”模式匹配搜索到的、尽可能短的字符串,而默认的“贪婪”模式匹配搜索到的、尽可能长的字符串。举例说明:
表达式 含义
*? 重复零次或多次,但尽可能少
+? 重复一次或多次,但尽可能少
?? 重复0次或1次,但尽可能少
{n}? 重复n次,但尽可能少
{n,}? 重复至少n次,但尽可能少
{n,m}? 重复n到m次,但尽可能少

你可能感兴趣的:(正则表达式)