正则表达式
来源:互联网 发布:python经纬度画轨迹图 编辑:程序博客网 时间:2024/05/22 19:43
正则表达式就是记录文本规则的代码。只不过比起通配符,它能更精确地描述你的需求
1、元字符
常用的元字符
代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字,,等价于[a-z0-9A-Z_](如果只考虑英文的话) \s 匹配任意的空白符 \d 匹配数字,等价于[0-9] \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束
2、重复(限定符)
常用的限定符
代码/语法 说明 * 重复零次或更多次,任意数量的不包含换行的字符 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次
懒惰限定符
代码/语法 说明 *? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复
例子
1、精确地查找hi这个单词 \bhi\b 2、先是单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词 \bhi\b.*\bLucy\b 3、以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字 0\d{2}-\d{8} \d必须连续重复匹配2次(8次) 4、匹配刚好6个字符的单词 \b\w{6}\b 5、QQ号必须为5位到12位数字 \d{5,12}\d 6、匹配最长的以a开始,以b结束的字符串,称为贪婪匹配。 a.*b 7、匹配最短的,以a开始,以b结束的字符串 a.*?b 8、 \(?0\d{2}[) -]?\d{8} 解析:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。 匹配到不符合的:(012-90998908或者010)19092345 修改 \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} 9、 [a-z]是指小写字母中的一个字符 [A-Z]是指大写字母中的一个字符 [0-9]是指数字中的一个字符 [a-zA-Z0-9_-]是指大小写字母、数字、下划线、横线中的一个字符 [a-z][A-Z][0-9]是指三个字符,其中第一个是小写字母,第二个是大写字母,第三个是数字
3、字符转义
\ 取消元字符的特殊意义
要查找\本身,用\\要查找*本身,用\*要查找(本身,用\(
4、反义:查找不属于某个能简单定义的字符类的字符
常用的反义代码
代码/语法 说明\W 匹配任意不是字母,数字,下划线,汉字的字符\S 匹配任意不是空白符的字符\D 匹配任意非数字的字符\B 匹配不是单词开头或结束的位置[^x] 匹配除了x以外的任意字符[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
例子:
匹配用尖括号括起来的以a开头的字符串 <a[^>]+> 注意:<a+>会匹配到<aaa>like>
5、分枝条件
满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开,从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了,注意顺序
美国邮编的规则是5位数字,或者用连字号间隔的9位数字\d{5}-\d{4}|\d{5}只会匹配5位的邮编(以及9位邮编的前5位)\d{5}|\d{5}-\d{4}
6、分组
重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作
默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 零宽断言 (?=exp) 匹配exp前面的位置 (?<=exp) 匹配exp后面的位置 (?!exp) 匹配后面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置 注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
简单的IP地址匹配(\d{1,3}\.){3}\d{1,3}分析:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。匹配到不符合的260.333.222.999使用冗长的分组描述一个正确的IP地址:255.255.255.255((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)25[0-5] 代表250~255范围2[0-4]\d 代表240~249范围[01]\d\d? 代表0~9或10~19或100~199的范围语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
7、反向引用
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本
匹配重复的单词,像go go\b(\w+)\b\s+\1\b指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+))
反向引用这个分组捕获的内容,你可以使用\k
匹配重复的单词,像go go\b(?<Word>\w+)\b\s+\k<Word>\b。
8、零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言
(?=exp) 匹配exp前面的位置(?<=exp) 匹配exp后面的位置匹配以'a'间隔的数字(再次强调,不包括'a'字符)匹配a字母前面两个数字\d+(?=\a)
9、负向零宽断言
查找不是某个字符或不在某个字符类里的字符的方法(反义)。但是如果我们只是想要确保某个字符没有出现
(?!exp) 匹配后面跟的不是exp的位置(?<!exp) 匹配前面不是exp的位置\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词。但是如果多做测试(或者你思维足够敏锐,直接就观察出来了),你会发现,如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错。这是因为[^u]总要匹配一个字符,所以如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符(可能是空格,或者是句号或其它的什么),后面的\w*\b将会匹配下一个单词,于是\b\w*q[^u]\w*\b就能匹配整个Iraq fighting。负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:\b\w*q(?!u)\w*\b。匹配除a字母外前面两个数字,如11b,22c等 \d{2}(?!a)
补充:
(?:exp) 非捕获组,匹配exp的内容,但不捕获到组里至于作用,一般来说是为了节省资源,提高效率比如说验证输入是否为整数,可以这样写^([1-9][0-9]*|0)$这时候我们需要用到()来限制“|”表示“或”关系的范围,但我们只是要判断规则,没必要把exp匹配的内容保存到组里,这时就可以用非捕获组了^(?:[1-9][0-9]*|0)$以上只是一个简单的例子,或许会觉得无所谓,但是如下的日期正则,如果全都用捕获组,那就是对资源的极大浪费了^(?:(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))([-/.])(?:0?2\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})([-/.])(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))$
参考:
http://www.jb51.net/tools/zhengze.html
阅读全文
0 0
- 【正则表达式】正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 钱数
- 【c++】vector简要用法
- Java运算符优先级
- 对抗生成网络(Generative Adversarial Net)
- 2017年7月8日 东方在新书发布会上的发言稿
- 正则表达式
- 二级指针与一级指针的一些区别
- Tarjan算法的操作原理
- mysql用union代替or
- Linux/Android系统知识之Qcom Platform开机流程概述
- HDU 1247 Hat’s Words 经典字典树
- 【PAT】【Advanced Level】1053. Path of Equal Weight (30)
- python3 GUI开发 (2)
- STL---auto_ptr实现