从某种意义上来说,正则就是通配符(如*、?)的加强版写法。
注释语法:(?#comment) ,其中comment代表注释内容。
正则中转义符为“/”
正则中可以使用条件进行限制,符号为“|”(意思应该是“或”)
. 可以匹配除换行外任意字符
* 匹配*前面的字符任意次(最少0次)
+ 匹配前面的字符重复1次或更多次
? 匹配前面的字符零次或一次
/b代表单词开始或结束位置(可以是空格、标点、回车、TAB等)
--例:/ba./b 代表匹配以a开始的单词后换行之前的本句所有字符
--/ba*/b 代表匹配仅以字母a组成的单词(如a、aa、aaaaa……)
/d 匹配一个数字(范围:0-9)
{n} 代表匹配前面的字符n次
{n,} 代表匹配前面的字符至少n次
{n,m} 代表匹配前面的字符至少n次,至多m次(符号均为半角,中间不可有空格)
--例:/d{5,} 代表需要匹配的对象中最少有连续5个数字
/s 匹配任何空白字符,包括空格、制表符、换页符等等。
/w 匹配字母或数字或下划线或汉字
^ 匹配字符串的开始
$ 匹配字符串的结束
--例:^/w{6}/s/w+$ 代表整个文本必须是以由6个字符(仅包括字母、数字、开线、汉字)组成的单词开头,并
紧跟一个空白字符,然后是由至少一个单词字符构成的单词结束。
[字符] 这种形式可以预定要匹配的字符,比如[aeiou]可以匹配任意一个且仅一个元音字母。
[.?!] 匹配(.或?或!)这三个中任意一个标点符号。
/f 匹配一个换页符。等价于 /x0c 和 /cL。
/n 匹配一个换行符。等价于 /x0a 和 /cJ。
/r 匹配一个回车符。等价于 /x0d 和 /cM。
/t 匹配一个制表符。等价于 /x09 和 /cI。
/v 匹配一个垂直制表符。等价于 /x0b 和 /cK。
重复多个字符可以使用分组,符号为“()”。此处()内的内容应该看做一个整体。
每个组都会有自己的名字,若没有人为命名则从第一个级开始依次为:/1 /2 /3 ……
分组的命名方式为(?<组名>/d*/b)或(?'组名'/d*/b)。
人为命名的分组引用方式为:/k<组名> 或 /k'组名'
实际上组号分配过程要从左向右扫描两遍:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组
的组号都大于未命名的组号
分组0对应整个正则表达式
--例:/b(/w+)/b/s+/1/b 用这个表达式可以轻松的找出连续重复的单词,具体怎么解释~~ “你懂的”
反义:将元字符转换为大写既是反义。(这里不清楚是否所有的元字符大写都是反义)
/W 匹配任意不是字母,数字,下划线,汉字的字符
/B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
零宽断言,分为正向(既匹配)与负向(既不匹配)两种。
语法如下:
(?=Examples) 匹配Examples前面的位置
(?<=Examples) 匹配Examples后面的位置
(?!Examples) 匹配((?!Examples)这个表达式)后面跟的不是Examples的位置
(?<!Examples) 匹配((?!Examples)这个表达式)前面不是Examples的位置
顾名思义,使用零宽断言不浪费字符位置。比如需要查找:包含字母t且t后面不是字母c的一个单词。此时可以使
用如下正则表达式:/b/w*t[^c]/w*/b 。但如果此单词最后一位是t的情况下[^c]依然会继续匹配下一个字符,那
么若用来匹配do not giev up 会取出 "not giev"两个单词。
是的,这并不是我的原意。
那好的,现在我使用 /b/w*t(?!c)/w*/b 来匹配。哇太棒了,结果是"not"!不得不承认我是个天才~~
贪婪匹配(最多匹配)
在使整个表达式能得到匹配的前提下匹配尽可能多的字符。
--例:a.*b 用来匹配ababababababab时会将ababababababab整个提取出来。
懒惰匹配(最少匹配)
在能使整个匹配成功的前提下使用最少的重复
--例:a.*?b 用来匹配ababababababab时会将ab切割提取出来,既只提取了第一个ab。
捕获 (不怎么理解这东西··)
(Examples) 匹配Examples,并捕获文本到自动命名的组里
(?<name>Examples) 匹配Examples,并捕获文本到名称为name的组里,也可以写成
(?'name'Examples)
(?:Examples) 匹配Examples,不捕获匹配的文本,也不给此分组分配组号
原义字符集:
/b 匹配一个单词边界,也就是指单词和空格(或标点)间的位置。
/B 匹配非单词边界。
/cx 匹配由x指明的控制字符。
/d 匹配一个数字字符。等价于 [0-9]。
/D 匹配一个非数字字符。等价于 [^0-9]。
/f 匹配一个换页符。等价于 /x0c 和 /cL。
/n 匹配一个换行符。等价于 /x0a 和 /cJ。
/r 匹配一个回车符。等价于 /x0d 和 /cM。
/s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ /f/n/r/t/v]。
/S 匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。
/t 匹配一个制表符。等价于 /x09 和 /cI。
/v 匹配一个垂直制表符。等价于 /x0b 和 /cK。
/w 匹配包括下划线的任何单词字符(包括汉字)。等价于’[A-Za-z0-9_]’。
/W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。
/xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。
/num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。
/n 标识一个八进制转义值或一个后向引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,
如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
/nm 标识一个八进制转义值或一个后向引用。如果 /nm 之前至少有is preceded by at least nm 个获取得子表达
式,则 nm 为后向引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件
都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。
/nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
/un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。