以前也有学过正则表达式,但常时间不用就忘得差不多的了,又读了一本关于正则表达式的书,觉得一些概念之类的还是记录下来比较好,以后用到的时候查看就行了。
[\b]回退并删除一个字符-backspace键
\f换页符\n换行符\r回车符\t制表位\v垂直制表位
注意:\r\n是windows所使用的文本行结束标签,而linux和unix只用\n结束一个文本行
.点匹配任意字符,但一般不匹配换行符
[0-9]====\d任何一个数字字符而\D====[^0-9]任何一个非数字字符
[a-zA-Z0-9_]===\w匹配一个字符数字字符(大小写都行)或下划线而\W正好相反除了那三类的
[\f\n\r\t\v]===\s匹配所有空白字符的类元字符(v后应该有一个空格)\S相反,匹配非空白字符注意\b不在内
另外还有POSIX字符类:注意使用下面字符类时必须用[]括起来例如[[:digit:]]
[:alnum:]任何字母或者数字[a-zA-Z0-9]
[:alpha:]任何一个字母[a-zA-Z]
[:blank:]空格或制表位[\t]注意t后有一个空格
[:digit:]任何一个数字[0-9]
[:lower:]任何一个小写字母[a-z]
[:upper:]任何一个大写字母
[:space:]任何一个空白字符包括空格[\f\n\r\t\v]v后有空格
[:xdigit:]任何一个十六进制数字[a-fA-F0-9]
++++++++++++++++++++++++++++++++++++++++++++++++++++++
{数字}用来设定匹配次数例如\d{3}表示3个数字
{数字,}表示最少匹配次数
{m,n}匹配m次到n次范围内
*匹配0次或多次
+至少匹配一次
注意:*和+都是贪婪型元字符,匹配时是匹配越多越好从头匹配到未取最长的匹配串
例如Baaa/BandBbbb/B用[Bb].*/[Bb]匹配的话为全部匹配
而我们想要匹配两个B/B那就不能用贪婪型元字符,而要用懒惰型版本(匹配尽可能少的字符)
用法:在贪婪型元字符后面加上一个?后缀即可例如*?+?{n,}?等等
+++++++++++++++++++++++++++++++++++++++++++++++++++
\b匹配单词边界例如\bcat\b只匹配cat这个完整单词
字符串的边界:^如果在[和]之间表示非,而用在模式的开头,匹配字符串的开头。
例如:^\s*B.*/B忽略空格的B标签内容
而$正好相反,它匹配字符串的结尾
注意:^和$只能匹配模式一次,符合模式的字符串的开头和结尾
而如果要匹配多行多次,需要用(?m)加以限制,
例如:(?m)^\s*//.*$匹配多行//开头的注释字符串
而如果只用^\s*//.*$只能匹配一次并且认为这次的结束就是整个字符串的结束。
+++++++++++++++++++++++子表达式:()++++++++++++++++++++++++++++++++++++++++
例子:19|20\d{2}这个匹配什么?是不是匹配以19开头或20开头的四位数年份,错!!
它匹配19这个数字或者以20开头的四位数的年份
如果匹配以19开头或20开头的四位数年份要写成(19|20)\d{2}因为|把上面分成了两部分。
子表达式还可以嵌套,用的时候注意分解就行!
匹配IP地址的例子:
有人写成(\d{1,3}\.){3}\d{1,3}这个没有语法错误,但是会匹配如299.300.455.658这样的无效IP
因此规则是这样的所有的1位或2位数字,以1开头的所有三位数字,以2开头第二位为0-4的3位数字,以25开头第三位是0-5的3位数字,写成如下:
((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
+++++++++++++++++++++++回溯引用:前后一致匹配+++++++++++++++++++++++++++++++++++++++
这是子表达式的另一个重要用途。
为了匹配前面匹配过的字符串,需要用到回溯例如H1/H1中的1,
需要这样写:H([1-6]).*?/H\1其中\1表示前面匹配的第一个子表达式内容
因此如果想匹配以前匹配过的内容,需要用到子表达式和\数字表相对位置,注意:第0个匹配,\0可以用来代表整个表达式。
注意:不同的语言中对回溯的实现一般有巨大的差异,并不是都是\+数字的方式
另外
+++++++++++++++++++++++回溯引用在替换操作中应用很重要++++++++++++++++++++
用子表达式的括号括起来的正则表示式,在替换操作中可以多次使用
例如:将313-555-4125这样的所有电话改为(313)555-4125的形式
RE式:(\d{3})(-)(\d{3})(-)(\d{4})
替换式:($1)$3-$5其中数字代表第几个子表达式
用$+数字代表RE式中匹配的内容,对文本重新排版的时候很有用。
++++++++++++++++大小写转换元字符及其应用(只是对有些有用)++++++++++++++++++++++++
\l将下一个字符转化为小写
\L将\L到\E的字符全部转换为小写
\u将下一字符转换为大写
\U将\U到\E之间的字符全部转换为大写
\E结束\L或\U
应用:j将h1aaa/h1替换为h1AAA/h1
RE:(h([1-6]))(.*?)(/h\1)
替换:$1\U$3\E$4
++++++++++++++++++++++++++前后查找++++++++++++++++++++++++++++
如果想将title/title中的文字内容查找出来,这样匹配:title.*/title不行,因为也匹配了标签,因此要用到向前查找和向后查找,一般都支持向前查找,有的不支持向后查找,JS和ColdFusion不支持向后查找。
向前查找:指定一个必须匹配但不在结果中返回的模式,实际就是一个子表达式,以?=开头的子表达式,需要匹配的文字在=后面。
例如:
用.+(?=:)匹配就是https,这里匹配了:但是没有返回到匹配结果中。
向后查找:查找在匹配文本之前的字符,但不返回它,符号为?=
例如:匹配$20.3中的价格,用到(?=\$)[\d.]+,返回20.3,但不返回带$的结果
上面匹配tilte/title之间的RE可以这样写:(?=title).*(?=/title),这样就只匹配内容了。
有了正向向前和向后,就有负向向前和向后,只是表示不以什么什么开头和不以什么什么结尾。
符号为?=和?!对应.*(?=:)表示匹配:以前的文本而?!表示不以某个字符结尾的文本
符号?=以什么开头的文本而?!表示不以什么开头的文本
例如文本中有$20,100,$10,50之类的字符,需要找出所有美元的价格,但不带美元符号,
(?=\$)[\d.]+,而要找出所有非价格数字,可以这样写\d(?!\$)[\d.]+\d,加上\d为了避免$20中的0也匹配。
++++++++++++++++++++++++++嵌入条件,条件匹配++++++++++++++++++++++++++++++++++
如果有这样一类情况,只有前面匹配了才需要匹配后面的,就像ifthen一样或者是ifelse
这需要用到嵌入条件的RE。
例子:需要匹配(0535)88888888或者0535-888888888这两种形式的电话号码,其它形式都不对,这就用到条件匹配,只要匹配了左括号就要匹配右括号,否则匹配-。
有两种形式的嵌入条件:使用形式是?(引用)true-re|false-re
第一:使用回溯引用进行条件处理
第二:使用前后查找进行条件处理(不常用)
回溯引用用法:这样写:(\()?\d{4}(?(1)\)|-)\d{7}
解释一下:首先用子表达式看是否匹配左括号(\()?
再匹配区号四位数字,
然后(?(1)\)|-)表示如果第一个子表达式匹配了左括号,则匹配\)右括号,如果没有匹配左括号,则匹配-
0 评论:
发表评论