1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
Regular Expression语法 1.纯文本匹配 word 2. .表示匹配任意一个单个字符,包括字母、数字或者点“.”本身(除换行符以外的任意单个字符) apple. 3.一个正则表达式里面允许有多个. appl.. .ppl. 4.如果真的需要.这个字符,那就需要在前面加上斜杠表示转义字符 apple\. 如果需要斜杠,就变成了\\: apple\\ 5.使用[]匹配多个字符中的某一个 [abcd]pple 结果中只会搜索pple前面是a或者b或者c或者d的字符串 [Rr]egular [Aa]pple 一般用于在某个特定成分不需要区分大小写的字符串 6.使用-匹配一个字符区间 [a-z]pple [0-9]pple [A-D]pple 表示在区间内ASCII码顺序的所有 连字符-的这个作用只在[]内有用,在[]外表示的就是连字符-本身,不是别的特殊含义 千万不要写[3-1]这样第一个比第二个大的情况,因为这个区间是没有意义的,往往会让整个模式失效 7.取非匹配^ ^用于排除那些不需要得到的字符,比如不希望在a.c中间出现的是数字: a[^0-9]c 正则表达式经常被简称为模式 普通字符:纯文本 元字符:在正则表达式里有特殊含义的特殊字符 8.对元字符来说,要匹配元字符本身,就需要用\来转义 \[ \] \. \\ 如果不这样的话,正则表达式分析器很可能会抛出一个错误 外加还有: \+ \* \? 9.匹配空白字符 [\b] 回退(并删除)一个字符(Backspace键) \f 换页符 \n 换行符 \r 回车符 \t 制表符(Tab键) \v 垂直制表符 所以搜索两条记录中的空白行: Windows系统:\r\n\r\n Unix、Linux系统:\n\n 10.匹配数字(或者非数字) \d 表示任何一个数字字符,等价于[0-9] \D 表示任何一个非数字字符,等价于[^0-9] (所以说可以得知:正则表达式的语法是区分大小写的) 11.匹配字母数字和下划线(或者非字母数字下划线) \w 表示一个字母数字或者下划线字符,等价于[a-zA-Z0-9_] \W 表示一个非字母数字或下划线字符,等价于[^a-zA-Z0-9_] 12.匹配空白字符(与非空白字符) \s 表示一个空白字符,等价于[\f\n\r\t\v] \S 表示一个非空白字符,等价于[^\f\n\r\t\v] 注意:\b不在\s的覆盖范围之内(所以在\S的覆盖范围之内) 13.通过给出某个特定字符的八进制或者十六进制来匹配它本身 八进制: 在前面加\0:如\011表示ASCII字符9,也就是制表符\t 十六进制: 在前面加\x 14.使用\c匹配控制字符(较少见) \cZ将匹配Ctrl-Z 15.使用POSIX字符类(许多正则表达式都支持,不过Javascript不支持) [:alnum:] == [a-zA-Z0-9] [:alpha:] == [a-zA-Z] [:blank:] 空格或者制表符 等价于 [\t] (注意最后有个空格哦~) [:cntrl:] ASCII控制字符(也就是ASCII 0-31,再加上ASCII 127) [:digit:] == [0-9] [:graph:] 和[:print:]一样,但不包括空格 [:lower:] 任何一个小写字母,等价于[a-z] [:print:] 任何一个可打印的字符 [:punct:] 既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符 [:space:] 任何一个空白字符,包括空格,等价于[^\f\n\r\t\v] (注意最后面有个空格哦~~~~) [:upper:] 任何一个大写字母,等价于[A-Z] [:xdigit:] 任何一个十六进制数字,等价于[a-fA-F0-9] 比如说检验一个RGB值: #[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] 16.匹配一个或者多个字符,使用+ \w+@\w+\.\w+可以用来匹配一个电子邮箱地址 +匹配一个或者多个字符,至少一个 但是上面的例子不能匹配liu.chuo@qq.com这种前面名字就出现了.字符的字符串,所以可以改成: [\w.]+@[\w.]+\.\w+ 在字符集合里面使用的时候,.或者+这些可以不用转义,但是转义了也没有坏处: [\w.] == [\w\.] 17.匹配0个或者多个字符,使用* 为了避免电子邮箱地址里面第一个字符是.的不合法情况,可以采取下面的方法: \w+[\w.]*@[\w.]+\.\w+ 18.匹配0个或1个字符,使用? 比如可以接受http:和https:两种,s可以出现0次或者1次 https?: 关于windows里面是\r\n\r\n,而Unix里面是\n\n的情况,可以这样处理: [\r]?\n[\r]?\n 19.设置匹配的重复次数,使用{} 所以上面那个RGB的颜色检验的语句: #[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] 可以写成: #[[:xdigit:]]{6} 20.为重复匹配次数设定区间,如{1,5} a{2,4} 最少重复2次,最多重复4次 重复次数也可以是0,比如{0,5} 21.至少重复次数匹配:最少重复3次 {3,} $\d{3,} 就能把$100之上的所有价格都选出来 22.* + {n,}都是多多益善的,它们是贪婪型字符,所以会匹配到能够满足的最长的情况 如果我们需要的是最短的情况,可以在符号后面加上?,它们就变成了懒惰型字符 比如: <[Bb]>.*?<[Bb]> 这样会匹配到第一个满足该正则表达式的结果 23.使用\b限定边界 \bcat\b 可以防止检测出含有cat的长单词,因为左右需要有边界才能被检验出来(b => boundary) \bcat 以cat为后缀 cat\b 以cat为前缀 24.反之,\B表示不是单词边界 \B-\B 检验前后都不是单词边界的连字符 25.字符串边界: 定义字符串开头的^,和定义字符串结尾的$ (^只有放在[]里面且左边紧跟[的时候才会表示求非的意思,其他时候是字符串开头的边界符) ^\s*<\?xml.*\?>(检测文本是否以<?xml?>标签开头) </[Hh][Tt][Mm][Ll]>\s*$(检测文本是否以</html>结尾) 26.分行匹配模式 在前面加(?m)能够让正则表达式引擎把行分隔符当做一个字符串分隔符来对待 (?m)^\s*//.*$(匹配每一个注释字符串) 有许多正则表达式实现不支持(?m) 27.子表达式 补充: 表示非换行型空格 "non-breaking space" 比如想检验超过两次出现非换行型空格的地方的时候,使用: {2,} 是错误的,因为只会检验;出现2次以上的 所以用:( ){2,},此时( )是一个子表达式,被看作一个独立元素 所以检验ip地址可以写成: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 也可以写成: (\d{1,3}.){3}\d{1,3} 28. |操作符 检验出生年份是否合法,限定只能19或者20开头: (19|20)\d{2} 因为|操作符(叫“或操作符”)是把后面当做一个整体来看待的,所以必须要在19|20两边加上括号 这样才能保证后面的\d{2}不被或操作符包括在内 或操作符也可以写多个: (19|20|21)\d{2} 29.子表达式可以嵌套 30.回溯引用:允许正则表达式模式引用前面的匹配结果 匹配重复出现了两次的单词: [ ]+(\w+)[ ]+\1 [ ]+匹配一个或多个空格 (\w+)两边的小括号的作用是用来表示这里面是一个子表达式 目的是将整个表达式的一部分单独划分出来以便在后面引用 \1是一个回溯引用,\1代表模式里面的第1个子表达式,\2代表模式里面第2个子表达式……以此类推 所以说,子表达式是通过它们的相对位置来引用的 所以匹配一个HTML标题标签(h1~h6都行,但是前后两个标签的数字必须一致): <[Hh]([1-6])>.*?</[Hh]\1> 回溯引用只能用来引用模式里面的子表达式(就是用小括号括起来的正则表达式片段) \0可以用来表示整个正则表达式 31.使用$1这样的形式可以实现替换功能 把文中所有电子邮箱地址替换成可点击的: 查找电子邮箱地址的代码:(\w+[\w\.]*@[\w\.]+\.\w+) 替换操作的代码:<A HERF = "mailto:$1">$1</A> $1表示第一个子表达式,$2表示第二个子表达式……以此类推 32.用来进行大小写转换: \l 把下一个字符转换为小写 \u 把下一个字符转换为大写 \L 把\L到\E之间的字符全都转换为小写 \U 把\U到\E之间的字符全部转换成大写 \E 结束\L或者\U转换 正则表达式:(<[Hh]1>)(.*?)(</[Hh]1>) 替换:$1\U$2\E$3 |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼