/w 任意字母数字字符
/s 任意空格符, 如spaces、tabs、newlines等
/d 任意数字字符
/b 界定字的边界
以下重复都以最多重复次数为原则
* 重复任意次数
+ 重复至少一次
? 重复零次或一次
{n} 重复n次
{n,m} 重复至少n次,但不超过m次
{n,} 重复至少n次
若后面加上?则以最少重复次数为原则
一、basic 字符
(1)特殊字符^及$是用来查找某些字必需是文章的开头或结尾,比如说要验证七位数字的电话号码,
可能会输入^/d{3}-/d{4}$
(2)/b/w{6}/b (查找六个字母数字的字,如ab123c)
(3)/d+ (查找数字字符串)
(4)/ba/w*/b (查找a开头的字,如able)
(5)/b/d{3}-/d{4} (如123-1234), 同/b/d/d/d-/d/d/d/d
(6)/belvis/b.*/balive/b (查找elvis后面接有alive的文字符串,如elvis is alive)
(7)/b/w{5,6}/b (查找五个或六个字母数字字符的字,如as25d、d58sdf等)
(8)/b/d{3}/s/d{3}-/d{4} (查找十个数字的电话号码,如800 123-1234)
(9)/d{3}-/d{2}-/d{4} (查找社会保险号码,如 123-45-6789)
(10)^/w* (每行或整篇文章的第一个字)
二、匹配某范围的字符[]
[aeiou]所要查找的是a、e、i、o、u,[.?!]所要查找的是.、?、!这些符号
在中括号中的特殊字符的特别意义都会被移除,也可以指定某些范围的字符,
如”[a-z0-9]”,所指的就是任意小写字母或任意数字。
/(?/d{3}[( ] /s?/d{3}[- ]/d{4} (查找十位数字之电话号码,如(080) 333-1234 511 254 6654等。
/(?代表一个或零个左小括号(,而[( ]代表查找一个右小括号)或空格符,/s?指一个或零个空格符组。
但这样的RE会将类似800) 45-3321这样的电话找出来,也就是括号没有对称平衡的问题,
之后会用alternatives来决解这样的问题。
三、不包含在某特定字符组里(Negation)(大写)
/W 不是字母数字的任意字符
/S 不是空格符的任意字符
/D 不是数字字符的任意字符
/B 不在字边界的位置
[^x] 不是x的任意字符
[^aeiou] 不是a、e、i、o、u的任意字符
/S+ (不包含空格符的字符串)
四、择一(Alternatives)
需要查找几个特定的选择时使用|这个特殊字符
/b/d{5}-/d{4}/b|/b/d{5}/b 查找五个数字及九个数字(有-号)的邮政编码
五、群组(Grouping) ()
(/d{1,3}/.){3}/d{1,3} 寻找网络地址
(/d{1,3}/.){3}数字最小一位最多三位,并且后面接有”.”符号,
此类型的共有三个,之后再接一到三位的数字,但有可能999.999.999.999
所以有((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?) (寻找网络地址)
六、Backreference是用来查找群组中抓取的符合文字所相同的文字。
/b(/w+)/b/s*/1/b (寻找相同字,中间有空白隔开如dog dog)
(/w+)会抓取至少一个字符的字母或数字,并将它命名为群组1,之后是查找任意空格符,
再接和群组1相同的文字。如果不喜欢群组自动命名的1,也可以自行命名,以上述例子为例,
(/w+)改写为(?<Word>/w+),Backreference就要改写成为/k<Word>,
即/b(?<Word>/w+)/b/s*/k<Word>/b (使用自行命名群组抓取重复字)
七、抓取(Captures)
(exp) 符合exp并抓取它进自动命名的群组
(?<name>exp) 符合exp并抓取它进命名的群组name
(?:exp) 符合exp,不抓取它
(?=exp) 符合字尾为exp的文字
(?<=exp) 符合前缀为exp的文字
(?!exp) 符合后面没接exp字尾的文字
(?<!exp) 符合前面没接exp前缀的文字
(?#comment) 批注
八、Positive Lookaround 查找的是目前符合之前或之后的文字,并不包含符合本身
/b/w+(?=ing/b) (字尾为ing的字,比如说filling所符合的就是fill)
(?<=/bre)/w+/b (前缀为re的字,比如说repeated所符合的就是peated)
(?<=/d)/d{3}/b (在字尾的三位数字,且之前接一位数字)
(?<=/s)/w+(?=/s) (由空格符分隔开的字母数字字符串)
九、Negative Lookaround
如何查找一个非特定或非在特定群组的字符。只是要验证某字符是否存在而不要对应包括这些字符,
例如要查找一个字,它的字母里有q但接下来的字母不是u。
/b/w*q[^u]/w*/b (一个字,其字母里有q但接下来的字母不是u)
/d{3}(?!/d) (三个位的数字,其后不接一个位数字)
(?<![a-z ])/w{7} (七个字母数字的字符串,其前面没接字母或空格)
(?<=<(/w+)>).*(?=<///1>) (HTML卷标间的文字)
HTML卷标间的文字,加上批注
(?<= #查找前缀,但不包含它
<(/w+)> #HTML标签
) #结束查找前缀
.* #符合任何文字
(?= #查找字尾,但不包含它
<///1> #符合所抓取群组1之字符串,也就是前面小括号的HTML标签
) #结束查找字尾
十、advanced 字符
/n New line
/e Escape
/nnn ASCII八位码为nnn的字符
/r Carriage return
/a Bell 字符
/b 通常是指字的边界,在字符组里所代表的就是backspace
/t Tab
# 语法 说明
/xnn 十六位码为nn的字符
/unnnn Unicode为nnnn的字符
/cN Control N字符,举例来说Ctrl-M是/cM
/A 字符串的开始(和^相似,但不需籍由multiline选项)
/Z 字符串的结尾
/z 字符串的结尾
/G 目前查找的开始
/p{name} Unicode 字符组名称为name的字符,比如说/p{Lowercase_Letter} 所指的就是小写字
(?>exp) Greedy次描述,又称之为non-backtracking次描述。
(?<x>-<y>exp)或者(?-<y>exp) 平衡群组。让已命名的抓取群组可以在堆栈中操作使用。
(?im-nsx:exp) 为次描述exp更改RE选项,比如(?-i:Elvis)就是把Elvis大乎略大小写的选项关掉
(?im-nsx) 为之后的群组更改RE选项。
(?(exp)yes|no)
The subexpression exp is treated as a zero-width positive lookahead. If it matches at
this point, the subexpression yes becomes the next match, otherwise no is used.
(?(exp)yes)
Same as above but with an empty no expression
(?(name)yes|no)
This is the same syntax as the preceding case. If name is a valid group name, the yes
expression is matched if the named group had a successful match, otherwise the no expression is matched.
(?(name)yes)
Same as above but with an empty no expression