正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换。
什么是正则表达式?
**·**正则表达式是由一个字符序列形成的搜索模式。
· 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
· 正则表达式可以是一个简单的字符,或一个更复杂的模式。
· 正则表达式可用于所有文本搜索和文本替换的操作。
学习正则表达式之前首先需要掌握记忆这些基本概念:
1.元字符:(.,\w,\W,\d,\D,\s,/S,^,$,)
| 字符 | 含义 |
|---|---|
| . | 匹配除了换行符以外的任意字符。 |
| \s | 代表任意空白符(换行符,制表符,空格) |
| \S | 匹配任意非空字符串 |
| \b | 匹配单词边界,匹配单词的开头和结尾。 |
| \B | 匹配一个非单词边界 |
| \d | 匹配一个数字,等价于[0-9] |
| \D | 匹配一个数字,等价于[^0-9] |
| \w | 匹配一个单字字符(字母、数字或者下划线)等价于[A-Za-z0-9_],例如, /\w/ 匹配 “apple,” 中的 ‘a’,"$5.28,"中的 ‘5’ 和 “3D.” 中的 ‘3’。 \W匹配一个非单字字符。等价于[^A-Za-z0-9_],例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 “50%.” 中的 ‘%’。 |
| \W | 匹配一个非单字字符。等价于[^A-Za-z0-9_],例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 “50%.” 中的 ‘%’。 |
| ^ | 匹配字符串的开始用和在[]括号里面表示排除,/^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。 |
| \n | 查找换行符 |
| \f | 查找换页符 |
| \0 | 查找NULL字符 |
| \r | 查找回车符 |
| \xxx | 查找以八进制数 xxxx 规定的字符 |
我们发现\W加大写字母都是表示相反的意思。
2.分组符([],(),{});
| 字符 | 含义 |
|---|---|
| [] | 代表一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。例如,[abcd] 和[a-d]是一样的。他们都匹配"brisket"中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中得所有字符。 |
| () | 如果想要重复多个字符该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。eg: (\d{1,3}.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。 |
| {} | 表示量词的范围的。 |
3.修饰符(i,g,m);
| 字符 | 含义 |
|---|---|
| i | 忽略大小写 |
| g | 执行全局匹配 |
| m | 执行全局匹配 |
4.量词(*,?,+,-,{n,m},?=n,?!=n);
| 字符 | 含义 | |
|---|---|---|
| * | 匹配任意次,.*连在一起就意味着任意数量的不包含换行的字符。等价于{0,} | |
| + | 匹配前面一个表达式1次或者多次。等价于 {1,}。 | |
| - | 用在字符集“[…]”里表示一组字符,如果不是用在字符集“[…]”里,就是普通的字符,即减号 | |
| ? | 匹配前面一个表达式0次或者1次。等价于 {0,1}。 | |
| {n,m} | 匹配n到m次 | |
| x(?=y) | 匹配’x’仅仅当’x’后面跟着’y’.这种叫做正向肯定查找。 例如,/Jack(?=Sprat)/会匹配到’Jack’仅仅当它后面跟着’Sprat’。/Jack(?=Sprat | Frost)/匹配‘Jack’仅仅当它后面跟着’Sprat’或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。 |
| x(?!y) | 匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找。 例如,/\d+(?!.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!.)/.exec(“3.141”)匹配‘141’但是不是‘3.141’ |