正则表达式

EG

\bhi\b  
    :hi
\bhi\b.\Lucy  
    : hi Lucy
\bhi\b.*\bLucy\b
    :hi af...dsa Lucy

0\d\d-\d\d\d\d\d  == 0\d{2}-\d{5}
    :088-12345


元字符

代码 说明
. 匹配除换行符意外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符 包括空格、换行符等
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

注意:
^和&都匹配的是一个位置
作用:^\d{5,12}和\d{5,12}的区别:
^\d{5,12}:表示整个字符串只能是5--12个相连数字组成 eq:123456789
\d{5,12} : 表示整个字符串只要包含5--12个相连数字就可以 eg:asd123456fhg


字符类

指定匹配集合

  • 在[]中列出 如下,查找[]中列出的所有字符
    eg:[aeiou] [.?!&] [12398]
  • 范围
    eg: [1-9] : 查找一位数字
    [a-z0-9A-z] : 查找所有字符

分支条件

EG:(?0\d{2}[) -]?\d{8}
可以匹配如(010)12345678或022-12345678等
但也会匹配(012-12345678或010)12345678等

"|"

  • (0\d{2})[- ]?\d{8}|0\d{2}[- ]?\d{8}
    这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔

  • \d{5}-\d{4}|\d{5} 匹配5位数字 或者5位-4位的数字(12345 / 12345-1234)

  • 注意:使用分枝条件时,要注意各个条件的顺序
    | 分枝条件,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了


重复控制

代码 说明
* 重复0次及以上
+ 重复1次及以上
重复0次或1次
重复n次
重复n次及以上
重复n到m次

反义

代码 说明
\W 匹配任意不是字母、数字、下划线、汉字的字符
\S 匹配任意不是空白的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aei] 匹配除了aei这几个字母以外的任意字符

eg:
<a[^>]+>匹配用<>括号括起来的以a开头的字符串


分组

"()"

我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);
但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

  • eg:(\d{1,3}.){3}\d{1,3}
    \d{1,3}匹 配1到3位的数字,(\d{1,3}.){3}匹 配三位数字加上一个英文句号(这个整体也就是这个分组)重 复3次,最后再加上一个一到三位的数字(\d{1,3})。

默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括 号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
呃……其实,组号分配还不像我刚说得那么简单:

  • 分组0对应整个正则表达式
  • 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组 号
  • 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.

向后引用

向后引用用于重复搜索前面某个分组匹配的问题,例如,\1代表分组1匹配的文本

  • eg:
    \b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty
    这个表达式首先是一个单词, 也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b), 这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

  • 你也可以自己指定子表达式的组名。
    要指定一个子表达式的组名,请使用这样的语法:
    1.(?\w+)(或者把尖括号换成'也行
    2.(?'Word'\w+)),这样就把\w+的 组名指定为Word了。要反向引用这个分组捕获的 内容,你可以使用\k,所以上一个例子也可以写成这样:\b(?\w+)\b\s+\k\b。

分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
'' (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成 (?'name'exp)
'' (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
'' (?<=exp) 匹配exp后面的位置
'' (?!exp) 匹配后面跟的不是exp的位置
'' (?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅 读

posted @ 2017-07-07 17:55  jl小鱼2012  阅读(132)  评论(0编辑  收藏  举报