【元字符】
/b 单词的开头或者结尾 也就是单词的分界处 只匹配一个位置
例如:查找Li /bLi/b
查找Li后面不远处跟着一个Lucy /bLi/b.*/bLucy/b
. 匹配除了换行符以外的任意字符
* *前面的内容可以连续重复任意次数以使整个表达式得到匹配
.* 任意数量的不包含换行的字符(换行符'/n' ASCII编码为10 十六进制0X0A)
/bLi/b.*/bLucy/b 先是一个单词Li 然后是任意个任意字符(但不是换行)最后是Lucy
/d 匹配一位数字(0,或1,或2,或3......)
- 不是元字符 只是一个连接符
例如:
0/d/d-/d/d/d/d/d/d/d/d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能匹配区号为3位的情形)。
也可以这样写这个表达式:0/d{2}-/d{8}。 这里/d后面的{2}({8})的意思是前面/d必须连续重复匹配2次(8次)。
$ 匹配行结束符
例如:good$ 能够匹配 he is good 但不能匹配 they are goods
^ 匹配一行的开始
例如:^when 能够匹配 when the time now,但不能匹配 he is sleep when it cry
/ 这是引用符 将这里列出的元字符 转化为普通字符进行匹配 /$被用来匹配美元符号而不是行尾 /. 用来匹配点字符 而不是任意字符的通配符
【注释】
(?#comment)包含注释,
#后面到这一行结束的所有文本 将被当做注释 被忽略掉
2[0-4]/d(?#200-249)|25[0-5](?#250-255)|[01]?/d/d?(?#0-199)
#200-249,#250-255,#0-199 ,#后面的内容被注释掉
2[0-4]/d|25[0-5]|[01]?/d/d?
举例:
(?<=#注释<(/w+)>#注释).*#注释(?=#注释<///1>#注释)#注释
可以为以下格式:
(?<= #注释
<(/w+)> #注释
).* #注释
(?= #注释
<///1> #注释
) #注释
【零宽断言】
断言用来声明一个应该为真的事实。只有当断言为真时才会继续进行匹配
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像/b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言
(?=exp) 称为:零宽度正预测现行断言
断言自身能出现的位置的后面能匹配表达式exp
例如:/b/m+(?=ing/b) 匹配 以ing结尾的单词的前面部分(除ing以外的部分),
I'm singing while you're dancing 匹配的结果是:sing danc
(?<=exp) 称为:零宽度正回顾后发断言
断言自身出现的位置的前面能匹配表达式exp
例如:(?<=/bre)/w+/b 匹配 以re开头的单词的后半部分(除re以外的部分),
I'm reading 匹配的结果是: ading
((?<=/d)/d{3})+/b 给一个很长的数字中每三位加一个逗号(当然是从右边开始)
可以查找需要在前面和里面 添加逗号的部分
用它对1234567890进行查找的结果是234567890
(?<=/s)/d+(?=/s) 同时使用了两种断言 匹配以空白符间隔的数字(不包括这些空白符)
【小东西】
包含:[x]是匹配X任意字符
例如:a[out]e 能够匹配 aoe aue ate 但不能匹配are aee等
排除:[^x]是匹配除X外的任意字符
[^0-6]匹配除0-6之外的所有字符,,即含有7,8,9的字符
/< /> 匹配词的开始(/<) 和结束 (/>)
例如:/< the /> 能够匹配for the wise 但不能匹配otherwise
/( /) 将/( 和 /)之间的表达式定义为组(group) 并且将匹配这个表达式的字符保存到一个临时区域,最多可以为9个, 可以用/1到/9的符号表示
| 将两个匹配条件进行逻辑 或(or)
例如:(him|her)匹配it belongs to him 或 it belongs to her
+ 匹配一个或多个在它之前的那个字符
例如:9+ 匹配 9、 99、 999等
? 匹配0个或1个在它之前的那个字符
例如: 9? 匹配 9 或 8,7,6。。。。。
/{i/} /{i,j/} 匹配指定数目的字符 这些字符时在它之前的表达式定义的
例如:A[0-9]/{3/} 匹配 字符'A'后面正好跟着'3'个数字字符的串 A123
A[0-9]/{4,7/} 匹配 A后4-7个数字字符的串 A1234 A1234567
【QQ号必须为5位到12位数字】^/d{5,12}$
【中国的电话号码】
0/d/d-/d/d/d/d/d/d/d/d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字
也可以这样写这个表达式:0/d{2}-/d{8}。 这里/d后面的{2}({8})的意思是前面/d必须连续重复匹配2次(8次)
/b是只匹配一个位置,代表着单词的开头或结尾,也就是单词的分界处
【分枝条件】
使用时,要注意各个条件的顺序,原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用 | 把不同的规则分隔开
0/d{2}-/d{8}|0/d{3}-/d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
【验证Email地址】"^/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$"。
【验证InternetURL】"^http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?$"。
【简单的IP地址匹配】
(/d{1,3}/.){3}/d{1,3}
/d{1,3}匹配1到3位的数字,
(/d{1,3}/.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(/d{1,3})。
它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:
((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)。