正则表达式
1、普通字符 举例1:表达式 “c”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”c”;匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同) 举例2:表达式 “bcd”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”bcd”;匹配到的位置是:开始于1,结束于4。 2、 简单的转义字符 r,n 代表回车和换行符
t 制表符
代表 "" 本身
还有其他一些在后边章节中有特殊用处的标点符号,在前面加 “” 后,就代表该符号本身。比如:^,
3、能够与 ‘多种字符’ 匹配的表达式 w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 s 包括空格、制表符、换页符等空白字符的其中任意一个 . 小数点可以匹配除了换行符(n)以外的任意一个字符 举例1:表达式 “dd”,在匹配 “abc123” 时,匹配的结果是:成功;匹配到的内容是:”12”;匹配到的位置是:开始于3,结束于5。 举例2:表达式 “a.d”,在匹配 “aaa100” 时,匹配的结果是:成功;匹配到的内容是:”aa1”;匹配到的位置是:开始于1,结束于4。 4、自定义能够匹配 ‘多种字符’ 的表达式 [^abc] [f-k] [^A-F0-3] 举例1:表达式 “[bcd][bcd]” 匹配 “abc123” 时,匹配的结果是:成功;匹配到的内容是:”bc”;匹配到的位置是:开始于1,结束于3。 举例2:表达式 “[^abc]” 匹配 “abc123” 时,匹配的结果是:成功;匹配到的内容是:”1”;匹配到的位置是:开始于3,结束于4。 5、 修饰匹配次数的特殊符号 使用方法是:”次数修饰”放在”被修饰的表达式”后边。比如:”[bcd][bcd]” 可以写成 “[bcd]{2}”。 {m,n} {m,} ? + * 举例1:表达式 “d+.?d*” 在匹配 “It costs $12.5” 时,匹配的结果是:成功;匹配到的内容是:”12.5”;匹配到的位置是:开始于10,结束于14。 举例2:表达式 “go{2,8}gle” 在匹配 “Ads by goooooogle” 时,匹配的结果是:成功;匹配到的内容是:”goooooogle”;匹配到的位置是:开始于7,结束于17。 6 、其他一些代表抽象意义的特殊符号 $ b 举例1:表达式 “^aaa” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “^” 要求与字符串开始的地方匹配,因此,只有当 “aaa” 位于字符串的开头的时候,”^aaa” 才能匹配,比如:”aaa xxx xxx”。 举例2:表达式 “aaa
举例3:表达式 “.b.” 在匹配 “@@@abc” 时,匹配结果是:成功;匹配到的内容是:”@a”;匹配到的位置是:开始于2,结束于4。 $str = "abc_123##_d3=efg@@5%";
preg_match_all('/.b./',$str,$match);
var_dump($match);
输出结果为: array (size=1)
0 =>
array (size=5)
0 => string '3#' (length=2)
1 => string '#_' (length=2)
2 => string '3=' (length=2)
3 => string 'g@' (length=2)
4 => string '@5' (length=2)
举例4:表达式 “bendb” 在匹配 “weekend,endfor,end” 时,匹配结果是:成功;匹配到的内容是:”end”;匹配到的位置是:开始于15,结束于18。
一些符号可以影响表达式内部的子表达式之间的关系: 举例5:表达式 “Tom|Jack” 在匹配字符串 “I’m Tom,he is Jack” 时,匹配结果是:成功;匹配到的内容是:”Tom”;匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:”Jack”;匹配到的位置时:开始于15,结束于19。 7 、匹配次数中的贪婪与非贪婪 (d)(w+)(d) 非贪婪模式: (d)(w+?)(d) 举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。
8 、反向引用 1,2… 其实,”小括号包含的表达式所匹配到的字符串” 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 “括号内的子匹配已经匹配到的字符串”。引用方法是 “” 加上一个数字。”1” 引用第1对括号内匹配到的字符串,”2” 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 “(” 在前,那这一对就先排序号。 举例1:表达式 “(‘|”)(.*?)(1)” 在匹配 ” ‘Hello’,“World” ” 时,匹配结果是:成功;匹配到的内容是:” ‘Hello’ “。再次匹配下一个时,可以匹配到 ” “World” “。 举例3:表达式 "<(w+)s*(w+(=('|").*?4)?s*)*>.*?</1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功
9、 预搜索,不匹配;反向预搜索,不匹配 正向预搜索:”(?=xxxxx)”,”(?!xxxxx)” 格式:”(?=xxxxx)”,在被匹配的字符串中,它对所处的 “缝隙” 或者 “两头” 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 “b”,本身不匹配任何字符。”b” 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。 举例1:表达式 “Windows (?=NT|XP)” 在匹配 “Windows 98,Windows NT,Windows 2000” 时,将只匹配 “Windows NT” 中的 “Windows “,其他的 “Windows ” 字样则不被匹配。 举例2:表达式 “(w)((?=111)(1))+” 在匹配字符串 “aaa ffffff 999999999” 时,将可以匹配6个”f”的前4个,可以匹配9个”9”的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。 格式:”(?!xxxxx)”,所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。 举例3:表达式 “((?!bstopb).)+” 在匹配 “fdjka ljfdl stop fjdsla fdj” 时,将从头一直匹配到 “stop” 之前的位置,如果字符串中没有 “stop”,则匹配整个字符串。 举例4:表达式 “do(?!w)” 在匹配字符串 “done,do,dog” 时,只能匹配 “do”。在本条举例中,”do” 后边使用 “(?!w)” 和使用 “b” 效果是一样的。 反向预搜索:(?<=xxxxx),(?<!xxxxx)
这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 “左侧”,两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 “正向预搜索” 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。 举例5:表达式 “(?<=d{4})d+(?=d{4})” 在匹配 “1234567890123456” 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。 10、其他通用规则 ①、表达式中,可以使用 “xXX” 和 “uXXXX” 表示一个字符(”X” 表示一个十六进制数) ②、在表达式 “s”,”d”,”w”,”b” 表示特殊意义的同时,对应的大写字母表示相反的意义 D W B ③、 在表达式中有特殊意义,需要添加 “” 才能匹配该字符本身的字符汇总
( ) [ ] { } . ? + * | ④、括号 “( )” 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 “(?:xxxxx)” 格式 举例1:表达式 “(?:(w)1)+” 匹配 “a bbccdd efg” 时,结果是 “bbccdd”。括号 “(?:)” 范围的匹配结果不进行记录,因此 “(w)” 使用 “1” 来引用。 ⑤、常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global Ignorecase Singleline Multiline ①xxxxxxxxx②n 配置为 Multiline 可以使 “^” 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 “$” 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。 Global 11、其他提示 ②、如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 “b”,比如:使用 “b(if|while|else|void|int……)b” 来匹配程序中的关键字。 ③、表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 “123”、”123.”、”123.5”、”.5” 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:”d*.?d*”,因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:”d+.?d*|.d+”。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |