K:正则表达式之基础简介
正则表达式(regular expression 简称regex) 是⼀种⼯具,和其它⼯具⼀样是为了解决某⼀类问题⽽发明的。正则表达式是⼀些⽤来匹配和处理⽂本的字符串。平时主要⽤于查和替换符合相应模式的⽂本,⽽该模式,就是由正则表达式所定义。需要注意的是,使⽤正则表达式对字符串进⾏匹配,正则表达式的编写⽅案并不是唯⼀的,同⼀个问题,往往会有多种⽅案。同时,需要注意的是正则表达式的语法是区分⼤⼩写的即\d和\D表⽰的是不同的意思。
正则表达式的特殊字符及其含义如下:
. ⽤来匹配任意单个字符,当字符本⾝为“.”时,需要使⽤\来对其进⾏转义即(\.⽤于表⽰.这个字符本⾝,⽽不是任意单个字符。在绝⼤多数的正则表达式的实现⾥,. 只能⽤于匹配除了换⾏符以外的任何单个字符)
[]⽤来定义⼀个字符集合。其表⽰在[]中所包含的字符的其中⼀个类似与sql语句中的in的作⽤。在[]中,可以使⽤“-”来表⽰⼀个集合的范围,例如[1-9]和[0123456789]是等价的,当然,其不仅限于数字,以下的也是合法的字符区间:
1. A-Z:匹配从A到Z的所有⼤写字母
2. a-z:匹配从a到z的所有⼩写字母
3. A-F:匹配从A到F的所有⼤写字母
4. A-z:匹配从ASCII字符A到ASCII字符z的所有字母,该模式不常⽤,因为其还包含着[和^等在ASCII字符表⾥排列在Z和a之间的字符。可
以在⼀个字符集合中给出多个字符区间,例如[A-Za-z0-9]表⽰所有的数字和⼤⼩写字母
同时,可以使⽤[^]⽤于表⽰需要匹配的字符不在该定义的集合区间中。当要匹配“[]”本⾝的时候,需要使⽤\来对其进⾏转义,即
的形式表⽰[]本⾝。
5. ps:对于转义字符\,若要表⽰该字符本⾝,需要使⽤\\来表⽰
以下的均为空⽩符(即原始⽂本的中的⾮打印字符)
1. \f⽤来匹配⼀个换页符
2. \n⽤来匹配⼀个换⾏符
3. \r⽤来匹配⼀个回车符
4. \t⽤来匹配⼀个制表符
5. \v⽤来匹配⼀个垂直制表符
6. 需要注意的是,\r\n是windows所使⽤的⽂本⾏结束标签,Unix和Linux系统只使⽤⼀个换⾏符来结束⼀个⽂本⾏;换句话说,在
Unix/Linux系统上匹配空⽩⾏只⽤\n即可,不需要加上\r。还有⼀点是,f、n、r、t、v等字符本⾝是普通的字符,当⽤其来匹配空⽩符的时候,需要对其进⾏转义。
以下的字符⽤来匹配⼀些打印字符
1. \d⽤于匹配任意⼀个数字,其等价于[0-9]
2. \D⽤于匹配任意⼀个⾮数字字符,其等价于[^0-9]
3. \w⽤于匹配任意⼀个字母字符(包括⼤⼩写)和数字字符或下划线字符,等价于[0-9A-Za-z_]
4. \W⽤于匹配任意⼀个⾮字母(包括⼤⼩写)数字或下划线字符,等价于[^0-9A-Za-z_]
5. \s⽤于匹配任意⼀个空⽩字符,等价于[\f\n\r\t\v]
6. \S⽤于匹配任意⼀个⾮空⽩字符,等价于[^\f\n\r\t\v]
7. \x⽤于匹配某个特定字符的⼗六进制,例如\x0A对应于ASCII码字符10,其效果等价于\n
8. \0⽤于匹配某个特定字符的⼋进制,例如\011对应于ASCII码中的字符9,其等价于\t
POSIX字符类:
1. [:alnum:]⽤于匹配任意⼀个字母或数字(等价于[a-zA-Z0-9])
2. [:alpha:]⽤于匹配任意⼀个字母(等价于[a-zA-Z])
3. [:blank:]⽤于匹配空格或制表符(等价于[\t ]注意的是,t后⾯有⼀个空格)
4. [:cntrl:]⽤于匹配ASCII码控制字符(ASCII码0到31,再加上ASCII码127)
5. [:digit:]⽤于匹配任意⼀个数字(等价于[0-9])
6. [:print:]⽤于匹配任意⼀个可打印字符
7. [:graph:]和[:print:]⼀样,但是不包括空格
8. [:lower:]⽤于匹配任意⼀个⼩写字母(等价于[a-z])
9. [:upper:]⽤于匹配任意⼀个⼤写字母(等价于[A-Z])
10. [:punct:]⽤于匹配既不属于[:alnum:]也不属于[:cntrl:]的任何⼀个字符
11. [:space:]⽤于匹配任意⼀个空⽩符,包括空格(等价于[^\f\n\r\t\v ]v后⾯还有⼀个空格)
12. [:xdigit:]⽤于匹配任何⼀个⼗六进制数字(等价于[a-fA-F0-9])
POSIX字符类的使⽤举例:
[[:xdigit:]]可以⽤于匹配A和F等16进制的数字。需要注意的是,POSIX字符类必须括在[:和:]之间。外层的[]⽤于定义⼀个字符集合重复匹配:
1. +⽤于匹配前⼀个字符⼀个或者多个,⾄少匹配⼀个,不匹配零个字符的情况。如果要匹配+本⾝这个字符,需要对该字符进⾏转义即
\+⽤于表⽰“+”这个字符本⾝。
2. *⽤于匹配零个或多个字符,如果要匹配*本⾝,需要对该字符进⾏转义,即\*表⽰字符“\*”本⾝。
3. ?⽤于匹配⼀个字符的零个或者⼀个,最多不能超过⼀个。如果要匹配字符?本⾝,则需要对字符?进⾏转义,即\?表⽰
匹配字符“?”本
⾝。
4. {m}⽤于匹配前⼀个字符m次,且必须是m次,少⼀次都不能进⾏匹配,需要注意的是,要匹配字符“{”和字符“}”,需要对其进⾏转义,
即\{和\}⽤于匹配“{”和“}”字符本⾝。
5. {m,n}⽤于匹配前⼀个字符最少m次,最多n次。
6. {m,}⽤于匹配前⼀个字符⾄少m次,即匹配m次或理论上得⽆限次。
需要注意的是,*和+以及{m,}都是贪婪型的匹配,其在进⾏模式匹配的时候,会尽可能的从⼀个⽂本的开头⼀直匹配到这段⽂本的末尾,⽽不是从这段⽂本的开头碰到第⼀个匹配的为⽌。要使其在碰到⽂本的第⼀个匹配为⽌就结束匹配,则应当将*和+以及{m,}变成懒惰匹配。变成懒惰匹配的⽅法是在*和+以及{m,}之后加上⼀个?使其在遇到合适的匹配的时候,就结束模式的匹配。
贪婪型匹配的⼀个例⼦:
⽂本:This offer is not available to customers living in <B>AK</B> and <B>HI</B>
正则表达式:<[Bb]>.*</[Bb]>
其匹配的结果是<B>AK</B> and <B>HI</B>
正则表达式修改为<[Bb]>.*?</[Bb]>
其匹配的结果:<B>AK</B> <B>HI</B>
位置匹配:
位置匹配⽤来解决在什么地⽅进⾏字符串匹配操作的问题。
1. \b⽤来匹配⼀个单词的开始或结尾。需要注意的是,如果想匹配⼀个完整的单词,则必须在需要进⾏匹配的单词前后均加上⼀个\b。例
如:\bcat\b⽤于匹配单词cat,⽽⽆法匹配scatter。⽽且需要注意的是,\b只是对位置进⾏匹配,⽽不匹配任何字符。
2. \B⽤于表明不匹配⼀个单词的边界即字母数字下划线之间,或者⾮字母数字下划线之间
⽤于匹配字符串的开头,即整个⽂本的开头。当要匹配字符本⾝的时候,需要对其进⾏转义处理,即\^⽤于匹配字符“^”本⾝
3. ⽤于匹配字符串的结尾,即整个⽂本的结尾。当要匹配字符本⾝的时候,需要对其进⾏转义处理,即⽤
正则匹配是什么于匹配字符“”本⾝
Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论