|
|
发表于
2018-10-17 08:03:34
来自手机
|
显示全部楼层
| 阅读模式
来自 湖南
如果本人免费教程有用请多多分享,转载请注明作者,By:函少,转载推介直接复制本贴地址!因为有课程关联
课程关联:
第一课【入门必修】
第二课【深入认识】
第三课【实战进阶】
第五课【实用技巧】
第六课【会员演示】
应该是目前网上最详细的【正则表达式】视频教程了,0基础开始学到熟悉所有常用语法!!!
本篇第四课,【正则表达式】视频教程:
优酷在线传送门
高清原版密码:mau2
注:点击蓝色字体直接跳转哦
警告:正则表达式全部都是用英文里面的字符,别把中文符号拿来用在正则表达式去匹配!!!
跟通配符完全俩个概念哦!!!
通配符里的*等价于正则表达式里的 .*
通配符里的?等价于正则表达式里的 .
优酷在线不可以全屏观看就这样操作
视频主要讲解内容:前面仔细认识字符,和常用技巧讲解,后面简单实战演示替换等一些注意事项
说明来源,一些注意事项
特殊字符
常用元字符,限定符
常用捕获组由来
以及贪婪于懒惰匹配结果区别
零宽断言
负向零宽断言
小括号,中括号,大括号最常用分组介绍
字符转义
后向引用
分枝技巧
等 价 于:
等价是等同于的意思,表示同样的功能,用不同符号来书写。
特点
正则表达式的特点是:
①灵活性、逻辑性和功能性非常强;
②可以迅速地用极简单的方式达到字符串的复杂控制。
③ 对于刚接触的人来说,比较晦涩难懂。所以特意出了教程分享经验心得。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,可以使用正则表达式来快速处理文本内容。
前言:由于有些符号不知道叫什么,所有就随便乱叫了,别喷,仔细看屏幕或者我这篇课程的辅导文本素材。
因为不把视频用到的素材发出来,单发个视频你们也记不住那么多是吧!何必好人做到底,帮你们节省时间,免去了你们去别地复制寻找麻烦。
切记:看不懂帖子素材的,可以先看完视频再来看帖子内容哦!!
视频时长:2小时3分钟, 你以为几分钟视频就能学会,太异想天开了吧!
小白谨记:本篇只是素材,我只是简单列几个例子,并不是我输入的举例就只有这几个可能有更多,我总不能全部举例出来吧!同时我输入的正则表达式语法搜索,不只会匹配举例的这几个哦!!!切记
注释:别被下面这些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有想像中的那么困难。
当然,如果你看完了这篇视频教程之后,应该发现自己也明白了很多,但是又不会一下子记住那么多,那也是很正常的
——我认为,没接触过正则表达式的人在看完这篇教程后,能把我提到过的,我会的语法记住80%以上的可能性很低。除非记忆超强,本人摸索一星期才把我这一星期得来的成果免费分享你们。
看了本次视频你就会明白常用的语法基本功了,以后你还需要勤加练习,多使用,才能熟练掌握、并记住正则表达式语法。
正则表达式的优化是门学问,需要自己动脑筋去优化了,比如简化正则表达式语法啊!还有就是同样的结果,有的表达式效率很高,有的很低哦!
常用的字符介绍:
- *等价于匹配长度{0,} 出现0次或多次。.*就会被解释成任意的字符串
- +等价于匹配长度{1,},出现1次或多次
- ?等价于匹配长度{0,1} 出现0次或者1次
- 说一下最常用的.*由来,以下是贪婪匹配,后面会说懒惰匹配模式。
- 例如用以下语句,举例说明
- 例如用a......b解释为a6个点b可以匹配到agfcgggb a中间6个字符结尾处b,也可以写成a.{6}b
- 但是要完全匹配所有怎么办,总不能中间有多少字符就用多少个点吧
- 所有我们需要引用上面的* ? +来表示前面 . 出现几次
- 所有 .* 就是说明前面 . 出现0次或者多次
- a.*b就会匹配下面所有结果
- 而a.+b除了ab以外匹配其他结果,因为确定.出现一次或者多次,ab中间没出现字符所有不与匹配
- 而a.?b只匹配出ab agb anb其他都不会匹配,因为确定.只会出现0次或者一次。
- ab
- adxccxbccb
- adxffxxbfcchbhjb
- a测试内容b
- agb
- anb
- agfcgggb
- ajbvvvvvbhvvbfghvuiijoojiojfszyub
复制代码
- . 匹配除 \r回车符, \n换行符之外的任何单个字符。注:一个点只能匹配单个字符。
- . 在不转义的情况下单独输入 . 会同时匹配 . 和单个字符,例如 .a. 会同时匹配 sad pal 和 .a. 所以要单独匹配 .a. 请使用 \.a\.
- . 匹配除“\r回车符”“\n换行符”之外的任何单个字符。注:只能匹配单个字符。
- 例如a.c匹配abc a2c ayc 不匹配abbc要匹配需要再加一点搜a..c
- n*:匹配前面的子表达式零次或者多次。等价于 n{0,} 表示无论n出现不出现或出现多次都会匹配
- ab*c 匹配abbbbbbbbc abbbc ac
- n+:匹配前面的子表达式一次或者多次。等价于 n{1,} 意思就是n可以出现一次或多次,不出现就不匹配
- 等价于n+。
- ab+c匹配abbbbbbbbc abbbc 不匹配 ac
- n?:匹配前面的子表达式零次或者一次。等价于 a{0,1} 意思就是n可以不出现或者出现一次
- ab?c 匹配ac abc 不匹配abbbbbbbbc abbbc
- ^ 匹配字符串的开始,在[]里表示例如[^1-3] 不匹配包含1 2 3的内容
- 例如^a.* 匹配asd和 adxcgchg 和 awe和 a 不匹配:sad 和sda 寓意开始带有a
- nbsp; 匹配输入字符串的结尾位置,则 $ 也等价于 \n 或 \r 要匹配 $ 字符本身,请使用 \$。
- 例如.*a$ 匹配sda和sma,不匹配dsh,寓意结束带有a
- ^a$寓意就是完全匹配a的意思
复制代码
\转义,搜索会用到、替换内容可能也会用到
- 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
- 例如\n匹配换行符, \\ 匹配\,而 \(则匹配 ( \$则匹配$
- 需要 转义 的 有 . * ? + $ ^ [ ] ( ) { } | \ 14个
- 搜索时带有这些特殊符号搜不到就需要用到转义,再前面加\ 在启用正则表达式模式下、输入替换内容替换时有时也会用到转义哦!
- 例如要同时匹配 \r \n 需要用到分支技巧,请使用像 \\r|\\n 的模式来匹配\r和\n
复制代码
小括号,中括号,大括号总结。例如正则表达式在默认不使用分组的情况下,都是只表示前面一个子表达式。
所有这时候分组就显得至关重要
- ()圆括号
- 将()小括号里的表达式定义为组,用来引用组里的内容。
- ()
- 标记一个字符出现的开始和结束位置。一个字符出现可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
- (abc).. 匹配abcvv abcgu abchi
- (abc).* 匹配abcabcabc abcabcijhgchhvrt 不完全匹配 qaabcrg但是匹配出abcrg
- (abc){4} 匹配 abcabcabcabc 不匹配abcabcabc只为只出现3次abc
- (abc){2,4} 匹配重复最少2到最多4次 abcabc abcabcabc abcabcabcabc 不匹配abc abcabcabcabcabc
- (abc)+v 能匹配 abcabcabcv abcv abcabcabcabcabcv不匹配v
- (abc)*v 能匹配 abcabcabcv abcv abcabcabcabcabcv 和 v
复制代码
- []方括号
- 标记一个中括号表达式的开始。要匹配 [,请使用 \[
- 解释寓意为 [内容] 匹配括号里的内容,可以为单个也可以为组合
- [0-9]{9}匹配0-9的字符串,例如匹配999999999 111111111 不匹配888888
- 例如[abc].. 匹配asd bcx cdf sdfabcg中的abc zzzcgh中的cgh
- [abc]. 匹配括号里的内容2个单词组合,例如as bc cx 匹配asd中的as
- [abc].... 匹配axcvc bsdxr cvbgf 同样也是不完全匹配 asddfdg但是能匹配到里面的asddf
- 总结经验为假设[abc]....后面5个点则匹配6位,因为括号里本身就是一个字符
- [abc].* 则匹配任意长度,任意组合。匹配 asd bvvv chbjgg abcvhhbhhggg
- ([a-c]{2}){3}匹配ababab acacac cacaca寓意a-c字符出现2次,后面大括号又定义小括号组里内容重复3次
- [1-4] 与“1”、“2”、“3”或“4”匹配。 不能匹配5以上数字
- [^1-4] 不与“1”、“2”、“3”或“4”匹配
- a[1|4|5] 匹配a1 a4 a5 不匹配a6
- [^xyz] 排除型字符集合,匹配未列出的任意字符
- 例如[^abcd]zz 等价于[^a-d]zz 匹配dzz fzz lzz 不匹配 azz bzz czz dzz
- [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
- [^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
- [abc]
- 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。也可以匹配所有单词带有a b c 无论开始中间还是结束
- asd abv zcc
- [a-zA-D1-5]{3}匹配aaa afx ABD 532 124 注:需要区分大小写
- [abc]{3}匹配aaa bbb ccc abc cba bca
复制代码
- {}大括号和分割介绍
- 标记限定符表达式的开始。要匹配 { 请使用 \{
- 限定符是用来指定正则表达式的一个给定的组建必须要出现多少次才能满足匹配。
- 有* + ? {n} {n,} {n,m} 共六种
- (\s){4} 寓意匹配4个空白符
- , 大括号重复匹配总结
- 分割例如c{2,3} 最少匹配2次最多匹配3次 ccc cc 不匹配c
- {n}:匹配确定的n次。例如c{2} 匹配cc 匹配cccccc 3次
- {n,}:至少匹配n次或多次。例如c{2,} 匹配cc ccccccccc 不匹配c
- {n,m}:最少匹配n次,且最多能匹配m次。
- 例如c{1,3}匹配c 和 cc和ccc
- - 表示连数
- [A-Z] 匹配26个大写字母,注:需要区分大小写
- [a-z]匹配 26个小写字母,注:需要区分大小写
- [0-9] 匹配0至9数字
- [A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
- ^[1-9]\d{4,9}匹配腾讯QQ号码,从10000一直匹配到十个九9999999999
- 总结:([])小括号里可以包含中括号,或者同时包含中括号和大括号([]{}),在n{m}满足不了的情况下可以使用()分组定义,(nnnn){m}这样的意思就是确定匹配小括号分组里的内容重复多少次。
- 或者使用中括号匹配更多的结果[a-zA-D1-5]{3}和[abc]{3}和[a,v,n]{3}等价于[a|v|n]{3}等等组合
- (a[1-9]){3}
- 匹配a2a2a9 a1a5a8 a1a1a1
- a[1-9]{3}匹配a121 a333 a553
- ([a-c]{2}){3}匹配ababab acacac cacaca
- 好了分组总结就到此为止
复制代码
分割语法
- [A,H,T,W] 包含A或H或T或W字母
- [a,h,t,w] 包含a或h或t或w字母
- [0,3,6,8] 包含0或3或6或8数字
复制代码
分枝技巧:
- |
- 指明两项之间的一个选择,注:会有优先权匹配前面的内容,具体如下:
- 例如查找http和https
- 输入http|https都只会匹配俩者的http
- https的前4个字符已经和http匹配成功了,轮不到https去匹配,就叫优先权匹配
- https|http就会匹配出 https和http
- 这样就会优先匹配https再去匹配http,就会同时匹配http和https
- 当然可以直接简化成https? 只是让你们知道 | 会有优先匹配前者因素
- 要匹配 |,请使用 \|
- 例如 abc|abv 同时匹配abc abv
- 可以简化为ab[c|v]或者使用分割语法ab[c,v] 来匹配 abc abv
复制代码
\b
- \b是正则表达式规定的一个特殊代码,好吧,某些人叫它元字符
- 代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。
-
- \b er\b放在后面表示结束带有er,单独的er单词也算
- 匹配 er adxer 不匹配 ersd erdxgf erherhh
- \ber放在前面表示开始带有er
- 匹配 er ersd erdxgf erherhh 不匹配 adxer
- \b总结意思就是表示开始结束带有er
复制代码
\b 跟 ^ 和 $ 完全是不一样的,例如下图
- \B \Ber放在前面表示能匹配中间带有er 和结尾带有er 不能匹配开始带有er的
- 匹配 adxer sdferhhh 不匹配 erdxgf er
- er\B。 \B 放后面能匹配中间和开始带有er
- 匹配 erdxgf sdferhhh 不匹配结尾带有 adxer sader er
- \ba\w*a\b 匹配以字母a开头的单词,然后是 \w* 任意数量的字母或数字下划线或者汉字出现0次或者多次,最后是单词结束处a\b
- 匹配a123fa a设计师几十块a asssssa,不匹配asddff
- \ba(\w){5}a\b则完全匹配addddda a11111a 不匹配assssa asddff
- \d 匹配一个数字字符。等价于[0-9]。注意Unicode正则表达式会匹配全角数字字符。
- 0\d\d-\d\d\d\d\d\d\d\d匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字
- 我们可以简短一下表达式为:0\d{2}-\d{8}。这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)
- 例如\d放后面A\d与“A0”至“A9” A2 A100 匹配。
- \d放前面\da 匹配1a 2a 3a 9a 不匹配a1 a2
- \D 匹配一个非数字字符。等价于[^0-9]。
- 例如例如\Da 匹配:了a ga .a @a +a 不匹配 2a 3a
- \n 匹配一个换行符。等于\x0a和\cJ。
- \s 匹配任何空白字符,包括空格、制表符、换页符等等。等于[ \f\n\r\t\v]。注意Unicode正则表达式会匹配全角空格符。
- 例如a(\s){4} 匹配a后面带4个空格,a (\s){4}a匹配前面4个空格加a, a
- \S 匹配任何非空白以外任意字符。等于[^ \f\n\r\t\v]。
- 小提示:所以[\s\S]* 也会匹配多行内容,例如下图
- 类似(?s).*
- \w 匹配字母或数字或下划线或中文汉字。类似[A-Za-z0-9_]但是不会匹配出中文汉字
- \W 匹配任何非单词字符。等于“[^A-Za-z0-9_]”。
- 例如\Wa匹配, .a ,a @a +a
- [\u4e00-\u9fa5] 仅匹配中文汉字
复制代码
【贪婪匹配语法介绍】
- 贪婪匹配
- 当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)
- 匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
- 【常用捕获组贪婪匹配语法】
- .* 组合匹配说明 . 出现0次或更多次,这是第一个捕获组 .* 组合可以匹配任意字符包含特殊符号以及汉字,所有类型组合
- 例如a.*b 匹配:ab ahgvhvvvvb a\/\_!.b asfxgbh$可gvb
- .+ 组合匹配前面.出现1次或更多次,这是第二个捕获组
- 例如a.+b匹配: ahgvhvvvvb a\/\_!.b asfxgbhgvb不匹配ab
- .? 组合匹配前面.出现0次或者一次,这是第三个捕获组
- 例如a.?b匹配:ab avb adb不匹配:ahhb aggggggb agcgcb
复制代码
【常用捕获组懒惰匹配语法】
- 懒惰匹配
- 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配最短的结果,
- a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
- 为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——先来后到懂吧!
- 懒惰匹配法
- 匹配最短的结果例如a.+?b匹配ahgvhvvvvb a\/\_!.b asfxgbhgvb只匹配出前面的asfxgb不匹配ab
- 匹配最短的结果例如例如a.*?b 匹配:ab ahgvhvvvvb a\/\_!.b 只匹配到 asfxgbh$可gvb 中的asfxgb
- *? 重复任意次,但尽可能少重复
- 例如a.*?b匹配ab和 avvvvvbaghhb 匹配结果2次为avvvvvb aghhb
- +? 重复1次或更多次,但尽可能少重复
- 例如a.+?b匹配avvvvvbaghhb 匹配结果2次为avvvvvb aghhb不匹配 ab
- ?? 重复0次或1次,但尽可能少重复
- 例如a.??b匹配ab agb 这个貌似和a.?b没任何区别,具体啥区别我也不知道哈!
复制代码
【重复匹配法】
- {n} 确定重复n次
- 例如(a){2}b 匹配aab 确定a出现2次
- {n,} 重复n次或更多次
- 例如(a){2,}b 匹配aab aaaaaaaaaaaaaaaaaaaab确定a出现2次或者多次
- {n,m} 最少重复n到最多重复m次
- 例如(a){2,5}b 匹配aab aaaaab确定a最少出现2次最多出现5次
复制代码
零宽断言和负向零宽断言介绍
- 零宽断言分为4类
- 正向零宽先行断言n(?=exp)
- 目标字符n出现的位置的右边必须匹配到exp这个表达式
- 负向零宽先行断言n(?!exp)
- 目标字符n出现的位置的右边不能匹配到exp这个表达式
- 正向零宽后发断言(?<=exp)n
- 目标字符n出现的位置的左边必须匹配到exp这个表达式
- 负向零宽后发断言(?<!exp)n
- 目标字符n出现的位置的左边不能匹配到exp这个表达式
- 注:关于先行和后发,还有其它称呼,譬如前瞻和后瞻等……
- 好了废话不多说举例说明清楚:
- m(?=n) 肯定预查,寓意:肯定前面m带有n内容,匹配时必须要有括号里的n的内容,同时又不会把n内容匹配出来
- 例如abc(?=1|2|3|4|5)等价于 abc(?=[1-5])
- 匹配出 abc1 abc2 abc3 abc4 abc5 中的abc又不把12345匹配出来 不匹配adc9 abcv 中的abc,因为确定abc后面带1 2 3 4 5才会匹配
- m(?!n) 否定预查,寓意:否定前面m不带有n内容,匹配时除了括号里的n的内容,同时又不会把n内容以外的内容匹配出来
- 例如abc(?!1|2|3|4|5) 等价于abc(?![1-5]),有点类似于abc[^1-5])但是abc[^1-5])会连abc后面内容一起匹配
- 匹配 abc9 abcv 中的abc又不把9 v匹配出来 不匹配abc1 abc2 abc3 abc4 abc5 前面的abc 因为否定abc后面不带1 3 5
- (?<=n)m寓意:肯定预查,确定m前面n内容,只会匹配m带有n的内容,同时又不会把n内容匹配出来
- (?<=1|3|5)a 匹配1a 3a 5a 中的a又不把135匹配出来 不匹配 9a ba 和:测试a 中的a
- (?<!n)m寓意:否定m前面n内容,只会匹配m不带有n的内容,同时又不会把n内容以外的内容匹配出来
- (?<!1|3|5)a 匹配 9a ba 和 测试a 中的a又不把9 b 测试 匹配出来 不匹配 1a 3a 5a中的a
- 结论:就是确定匹配括号里的n包含和不包含,包含和不包含都只匹配出m内容。不会匹配括号组里的内容出来。
- m放前面或者后面、都要用不同格式语法来表达哦!
- 增加一个加强否定预查(也可叫做反选)语法
- 正则:(?!.*baidu.*)^.*匹配结果为除了baidu关键词以外(无论是中间还是开始还是结束带baidu都不匹配)其他都与匹配
- 不匹配
- www.baidu.com
- http://www.baidu.com
- baidu
- baidu.com
- whvg.bbjb.baidu
- 匹配以下结果
- www.vhbhh.v.com
- www.bjvgggg.com
- sina.com.cn
- http://bbs.binmt.cc
- 注释:^.*【.*】就不废话解释了,具体要匹配排除baidu以外的什么结果你们自己去组合,例如(?!http.*baidu.*)^https?://.*或者(?!http.*baidu.*)\bhttps?://.* 只匹配http和https开始的网址,为什么 .* 前要加^,不加就会匹配aidu.com类似这样的结果,加个^开始就不会发生了
复制代码
后向引用
- 一个正则表达式中最多可以保存9个()组,它们可以用 \1 到\9 的符号来后向引用。
- 例如
- abc abc和
- abc abv abv abv abc a a a abc
- 这些该怎么表达呢?
- (abc).*\1
- 例如
- (\w).*\1 匹配
- ab55866a
- abbbbba
- 不匹配
- aojbhjj
- ajbvvjib
- (\w+)\s+(abv)\s+\2匹配abc abv abv
- (\w+)\s+(\w+)\s+\2\s+\2\s+\1\s+(a)\s+\3\s+\3\s+\1
- 匹配以下结果
- ab abc abc abc ab a a a ab
- abc abv abv abv abc a a a abc
- sd si si si sd a a a sd
- 后向引用:
- 捕获分组可以进行 后向引用 (如果正则表达式后面有相同的捕获分组内容,可以根据顺序直接引用前面定义的捕获组,简化表达式)
- 如\1对应第一组括号里的内容,\2对应第二组括号里的内容,以此类推
- (\d)\s+\1 这里的"\1"就是对"(\d)"的后向引用 ,等同于(\d)\s+(\d)
复制代码
搜索替换技巧介绍,学会后肆意妄为,注:记住勾选正则表达式
最终经验:$0代表所有内容无论有括号(1)(2)(3)(4),没有括号1234,或者只括号了一个例如(1)234,$0都代表所有查找内容,$1代表第一个括号里内容,$2代表第二个括号里内容,以此类推
- 基础语法 "^([]{})([]{})([]{})$
- 正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束
- 例如^([a]{2})([b]{3})([c]{4})$,匹配完全匹配 aabbbcccc
- ^([1]{2})([2]{3})([3]{4})$完全匹配 112223333
- 例如匹配电话号码
- ^(13[6,9]|15[6,9]|180|179)\d{8}匹配下面整段电话号码
- 13645855586
- 13989696969
- 15696966998
- 15986696966
- 18047868668
- 17925556685
- 我们可以写成\d{11}就可以匹配但是所有11位数都会匹配出来,所有我们需要定义下
- (136[6,9])\d{8}也可以用(13[6|9])\d{8}匹配所有136和139开头的电话号码出来13645855586 13989696969
- (136[6,9])\d{8}
- 验证手机号码:"^1[3|4][0-9]{9}$这个就会找到所有13 和14开头的号码
- 匹配网址(http.?)://(\w){3}.(\w+).* 注写成这样会把https httpo httpl 开头的都匹配出来
- https?://(\w){3}.(\w+).* 注:写成这样就只匹配http 和https开头的,自己取舍,httpf httpl 等等不会被匹配出来
- http://www.baidu.com
- https://www.baidu.com
- http://bbs.binmt.cc
- http://www.baihhbhjbhjbhdu.com
复制代码
增加几个正则表达式模式修饰符,注:在不同表达式都会有不同格式书写,但是字母意思不变
- (?i)即匹配时不区分大小写。表示匹配时不区分大小写。
- (?s)即Singleline(单行模式)。表示更改.的含义,使它与每一个字符匹配(包括换行 符\n)。
- (?m)即Multiline(多行模式) 。 表示更改^和$的 含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的 精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
- (?x):表示如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
- (?e):表示本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
- (?A):表示如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
- (?E):与"m"相反,表示如果使用这个修饰符,那么"[ DISCUZ_CODE_17 ]quot;将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。搜索
- (?U):表示和问号的作用差不多,用于设置"懒惰匹配模式"
- 结论目前MT管理器只支持:
- (?i)匹配时不区分大小写由于MT管理器自带区分大小写所有这个可以忽略
- (?s)匹配多行结果不受换行符影响
- 例如(?s) +<service.*?/>
- 匹配 <service
- android:name="com.mh.movie.core.androidupnp.service.SystemService"
- android:exported="false" />
-
复制代码
不懂的内容如下:
- \r?\n 匹配零或一个出现回车符后接新行的次数。回车符不等同?于换页符
- \r 匹配一个回车符。等于\x0d和\cM。请注意,\r 不等同于换行符,\n。
- \f 匹配一个换页符。等于\x0c和\cL。
- \t 匹配一个制表符。等于\x09和\cI。
- \v 匹配一个垂直制表符。等于\x0b和\cK。
- \xnn 十六进制转义字符序列。匹配两个十六进制数字nn表示的字符。例如,“\x41”匹配“A”。“\x041”则等于“\x04&1”。正则表达式中可以使用ASCII编码。.
- \num 向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的捕捉群(capture group)一个字符出现(subexpression)匹配。其中num是从1开始的十进制正整数,其上限可能是9[注 2]、31[注 3]、99甚至无限[注 4]。例如:“(.)\1”匹配两个连续的相同字符。
- \nm 3位八进制数字,标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得一个字符出现,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
- \nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
- \un Unicode转义字符序列。其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。
- \cx 匹配由x指明的控制字符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。控制字符的值等于x的值最低5比特(即对3210进制的余数)。例如,\cM匹配一个Control-M或回车符。\ca等效于\u0001, \cb等效于\u0002, 等等...
- 常用分组语法
- (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
- (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
- 注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
- \a 报警字符(打印它的效果是电脑嘀一声)
- \e Escape
- \0nn ASCII代码中八进制代码为nn的字符
- \xnn ASCII代码中十六进制代码为nn的字符
- \unnnn Unicode代码中十六进制代码为nnnn的字符
- \cN ASCII控制字符。比如\cC代表Ctrl+C
- \A 字符串开头(类似^,但不受处理多行选项的影响)
- \Z 字符串结尾或行尾(不受处理多行选项的影响)
- \z 字符串结尾(类似$,但不受处理多行选项的影响)
- \G 当前搜索的开头
- \p{name} Unicode中命名为name的字符类,例如\p{IsGreek}
- (?>exp) 贪婪子表达式
- (?<x>-<y>exp) 平衡组
- (?im-nsx:exp) 在子表达式exp中改变处理选项
- (?im-nsx) 为表达式后面的部分改变处理选项
- (?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no
- (?(exp)yes) 同上,只是使用空表达式作为no
- (?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no
- (?(name)yes) 同上,只是使用空表达式作为no
- 平衡组/递归匹配
- 这里介绍的平衡组语法是由.Net Framework支持的;其它语言/库不一定支持这种功能,或者支持此功能但需要使用不同的语法。
- 有时我们需要匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构,这时简单地使用\(.+\)则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式,懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等,比如( 5 / ( 3 + 2 ) ) ),那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的,配对的括号之间的内容呢?
- 为了避免(和\(把你的大脑彻底搞糊涂,我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?
- 这里需要用到以下的语法构造:
- (?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
- (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
- (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
- (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
- 如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。
- 我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。
- 注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
- 我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式,只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面,也不会拥有组号。“我为什么会想要这样做?”——好问题,你觉得为什么呢?
- < #最外层的左括号
- [^<>]* #最外层的左括号后面的不是括号的内容
- (
- (
- (?'Open'<) #碰到了左括号,在黑板上写一个"Open"
- [^<>]* #匹配左括号后面的不是括号的内容
- )+
- (
- (?'-Open'>) #碰到了右括号,擦掉一个"Open"
- [^<>]* #匹配右括号后面不是括号的内容
- )+
- )*
- (?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败
- > #最外层的右括号
- 平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.
- 语法与释义:
- ?,*,+,\d,\w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
- 初学者可以忽略?,*,+,\d,\w一些简写标示符,学会了基础使用再按表自己去等价替换
- [\t\u007c] 匹配制表符 (\t) 或垂直条 (|)。
- [^aAeEiIoOuU] 与任何非元音字符匹配。
- 正则表达式应用——删除空行
- 该表达式代表待查找的空行。(技巧提示:空行仅包括空格符、制表符、回车符,且必须以这三个符号之一作为一行的开头,并且以回车符结尾,查找空行的关键是构造代表空行的正则表达式)。
- 直接在"查找"中输入正则表达式“^[ \t]*\n”,注意\t前有空格符。替换内容填空。就可以删除所有空行
- 正则表达式应用——实例应用
- 证用户名和密码:("^[a-zA-Z]\w{5,15}[ DISCUZ_CODE_14 ]quot;)正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
- 证电话号码:("^(\d{3,4}-)\d{7,8}[ DISCUZ_CODE_14 ]quot;)正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
- 证身份证号(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}[[0-9],0-9xX]";
- 证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*[ DISCUZ_CODE_14 ]quot;);
- 能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+[ DISCUZ_CODE_14 ]quot;);
- 数或者小数:^[0-9]+([.][0-9]+){0,1}$
- 能输入数字:"^[0-9]*[ DISCUZ_CODE_14 ]quot;。
- 能输入n位的数字:"^\d{n}[ DISCUZ_CODE_14 ]quot;。
- 只能输入至少n位的数字:"^\d{n,}[ DISCUZ_CODE_14 ]quot;。
- 只能输入m~n位的数字:"^\d{m,n}[ DISCUZ_CODE_14 ]quot;。
- 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)[ DISCUZ_CODE_14 ]quot;。
- 只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?[ DISCUZ_CODE_14 ]quot;。
- 只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?[ DISCUZ_CODE_14 ]quot;。
- 只能输入非零的正整数:"^\+?[1-9][0-9]*[ DISCUZ_CODE_14 ]quot;。
- 只能输入非零的负整数:"^\-[1-9][0-9]*[ DISCUZ_CODE_14 ]quot;。
- 只能输入长度为3的字符:"^.{3}[ DISCUZ_CODE_14 ]quot;。
- 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+[ DISCUZ_CODE_14 ]quot;。
- 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+[ DISCUZ_CODE_14 ]quot;。
- 只能输入由26个小写英文字母组成的字符串:"^[a-z]+[ DISCUZ_CODE_14 ]quot;。
- 验证是否含有^%&',;=?$"等字符:"[%&',;=?$\\^]+"。
- 只能输入汉字:"^[\u4e00-\u9fa5]{0,}[ DISCUZ_CODE_14 ]quot;。
- 验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?[ DISCUZ_CODE_14 ]quot;。
- 验证一年的12个月:"^(0?[1-9]|1[0-2])[ DISCUZ_CODE_14 ]quot;正确格式为:"01"~"09"和"10"~"12"。
- 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)[ DISCUZ_CODE_14 ]quot;正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。
- 获取日期正则表达式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?
- 可用来匹配大多数年月日信息。
- 匹配双字节字符(包括汉字在内):[^\x00-\xff]
- 可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
- 匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</>|<.*? />
- 网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
- 匹配首尾空白字符的正则表达式:^\s*|\s*$
- 可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
- 匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
- 网上流传的版本功能很有限,上面这个基本可以满足需求
- 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 表单验证时很实用
- 匹配中国邮政编码:[1-9]\\d{5}(?!\d)
- 中国邮政编码为6位数字
- 匹配ip地址:([1-9]{1,3}\.){3}[1-9]。
- 提取ip地址时有用
- 匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]
复制代码
最终申明:有错误请帮忙纠正好吗?感谢了!由于时间原因就不做过多的实战演示了,剩下的路靠你们自己去多实战熟练了。链接失效帖子下面回复!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +14
金币 +68
|