正则表达式的定义:用来描述或匹配一系列匹配某个句法规则的字符串。
正则的语法有哪些:
1. 选择
竖线 | ,最低优先级
2. 数量限定
+ 代表符号前面的字符至少出现一次 (一次 ~ 多次)
?代表符号前面的字符最多可以出现一次 (0次、1次)
* 代表符号前面的字符可以出现 (0次 ~ 多次)
{n} 出现n次
{n,} 最少出现n次,范围在n~∞
{n,m} 出现次数n~m之间
3. 匹配
() 定义操作符的范围和优先级
4. 正则表达式
字符 | 描述 | 示例 |
---|---|---|
^ | 匹配开始位置 | c |
$ | 匹配结束位置 | c |
. | 匹配除\r \n 之外的单个字符 | c |
\ | 标记特殊字符 | n、\n |
x|y | 匹配x或者y | c |
[xyz] | 匹配x或y或z任意一个 | c |
[^xyz] | 匹配未列出的任意字符 | c |
[a-z] | 匹配a-z范围内的小写字母 | c |
[^a-z] | 匹配不在a-z范围内的字符 | c |
\b | 匹配一个单词边界 | er\b : 匹配 never 中的 er ,不匹配 verb 中的 er |
\B | 匹配非单词边界 | er\B : 不匹配 never 中的 er ,匹配 verb 中的 er |
\d | 匹配一个数字 | 等价于[0-9] |
\D | 匹配一个非数字 | 等价于[^0-9] |
\f | 匹配一个换页符 | 等价于\x0c和\cL |
\n | 匹配一个换行符 | 等价于\x0a和\cJ |
\r | 匹配一个回车符 | 等价于\x0d和\cM |
\s | 匹配任何空白字符 | 等价于[ \f\n\r\t\v] |
\S | 匹配任何非空白字符 | 等价于 [^ \f\n\r\t\v] |
\t | 匹配一个制表符 | 等价于\x09和\cI |
\v | 匹配一个垂直制表符 | 等价于\x0b和\cK |
\w | 匹配包括下划线的任何单词字符 | 等价于[A-Za-z0-9_] |
\W | 匹配任何非单词字符 | 等价于[^A-Za-z0-9_] |
\cx | 匹配由x指明的控制字符,x的值必须为A-Z或a-z | \cM匹配一个Control-M或回车符。\ca等效于\u0001, \cb等效于\u0002 |
(pattern) | 用括号括起来表示一个子模式,匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用 | |
(?:pattern) | 匹配pattern但不获取匹配的子字符串 | industr(?:y | ies), industry | industries |
(?=pattern) | 正向肯定预查,非获取匹配 | |
(?!pattern) | 正向否定预查,非获取匹配 | |
(?<=pattern) | 反向肯定预查,非获取匹配 | |
(?<!pattern) | 反向否定预查,非获取匹配 |
正则表达式的获取匹配和非获取匹配
用括号括起来表示一个子模式,这个子模式就是一个获取匹配,如果在子模式的前面加上 ?:、 ?! 、?<=、 ?<!,就成为非获取匹配
<div id="test">
Windows 103
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
</div>
<button onclick='reg_replace()'>替换</button>
function reg_replace()
{
var test = document.getElementById("test");
var regex = /(Windows [\w]+\b)/g; // 加上括号获取匹配
var regex2 = /Windows [\w]+\b/g; // 去掉括号 非获取匹配
var regex3 = /(?:Windows [\w]+\b)/g; //加上?: 非获取匹配
test.innerHTML = test.innerHTML.replace(regex,"<span style='background-color:orange'>$1</span>");
}
获取匹配会把子模式中保存起来,用于向后引用,同时可以使用$1引用,一个括号代表一个子模式,$1 表示匹配第一个括号里的字符串,如果有多个()包含,顺序依次向后加 $1 $2 $3 ……$n
非获取匹配
(?:pattern) 匹配结果。Java(?:6|7)等效于Java6|Java7,在需要使用()的情况下,同时不需要把匹配的内容进行保存,后面也不需要引用,可以用这种方式,同时也是对资源的节约
在非获取匹配下,也不会拥有分组的组号
零宽断言
零宽度的匹配,查找某个内容之前或者之后的内容,匹配的内容不会保存到对应的匹配结果中,仅仅匹配了一个位置。
1. 正向预查
(?=pattern) 正向匹配。Java(?=6),匹配后面跟着6的Java
(?!pattern) 正向不匹配。Java(?!6),匹配后面不跟着6的Java
2. 反向预查
(?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a
(?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a
正则replace特殊标记符$
字符 | 替换文本 |
---|---|
$1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
正则replace应用—千分制
// 整数千分制
let a = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
// 可以包含小数点后两位的千分制
var b = '99999999999.02'.replace(/\d{1,3}(?=(\d{3})+(?:\.\d{1,2})?$)/g, '$&,');
正则符号的优先级
优先权 | 符号 |
---|---|
最高 | \ |
高 | ()、(?:)、(?=)、[] |
中 | *、+、?、{n}、{n,}、{n,m} |
低 | ^、$、中介字符 |
次最低 | 串接,即相邻字符连接在一起 |
最低 | | |
正则的贪婪&非贪婪
贪婪模式,匹配尽可能多的,属于贪婪模式的量词包括 {n,m} {m,} ? * +
非贪婪模式,匹配尽可能少的,在贪婪模式基础上再加上?即为非贪婪模式。
var str='aabab';
var reg=/a.*?b/g;
var res=str.match(reg);
console.log(res);
结果:
["aab", "ab"]
先匹配aab,再匹配ab,由于从左向右最先开始的匹配有最高优先级