JS中的正则表达式
1.RegExp类型
ECMAScript通过RegExp类型支持正则表达式。
let expression = /pattern/flags;
pattern(模式)是任何正则表达式,正则表达式可以带零个或多个flags。
常见 修饰符(标记)
修饰符 | 描述 |
---|---|
g | 全局匹配查找所有匹配项 |
i | 忽略大小写 |
m | 使边界字符 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整@ e f X个字符串的开头和结尾。 |
y | 粘附模式,表示只匹配以lastIndex为开头的字符串。(自动开启全局模式) |
s | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后U z e v ~ m, . 中包含换行符 \n。 |
例子:
// 匹配所有以"at"结尾的三字符组合,忽略大小写
let pattern = /.at/gi;
注:匹配元字符需要转义
1.1RegExU Z E M : np构造函数
正则表达式 也可以使用RegExp构造函) n I数来创建,它接收两个参数:模式字符串和(可选的)标记字符串。
let pattern1 = /[bc]at/i;
// 跟pattern1一样,只不过是用构造函数创建的} ) p
let pattern2 = new RegExp("[bc]at", "i");
注意:因为RegExp的模式参数是字符串,所以在某些情况下需要二次转义。具体做法是对字面量中的每个反斜杠前面再加一个反斜杠
1.2 实例属性
每个RegExp都有用于模z 9 0 U V式信息的实例属性a ? $ N { g 7 K。
属性 | 描述 |
---|---|
global、ignorCase、sticky、unicode、multiline、dotAs M Lll | 布尔值。分别判断是否设置了g、i、y、m / u Zu、m、s标记 |
lastIndex | 表示在源字符串Q r { ; o中下一次搜索的开始位置,始终从0开始 |
source | 表达式字面量字符串(去掉开始和结尾斜杠)k $ & – O h \ Z d |
flags | 标记信息字符串 |
1.3实例方法
① exec()
只接收一个参数,即要应用模式的字符串。
如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。
返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。
- index:c 9 5 q S ^ ^匹配到字! q i ~符串的起始位置。
- input:要查找的字符串
这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。
let text = "cat,bat";
let pattern = /E ) [ I Z n l m =([bc])at/i;
let matches = pattern: ; J u L * q U (.exec(text);
//["cat", "c", index: 0, input: "cat,bat", groups: undefined]
console.log(: [ w 9 / ! ) }matches[0]); // "cat"
console.log(matches[1]); // "c"
console.log(7 2 I Jmatches.lastIndex); //没有使用全局匹配,永远为0
如L a w v 8 A 1果在这个模式上设置了g标记,则, . + 2 4 U F o e每次调用exe% d B s ~ % vc()都会在字符串中向前搜索下一个匹配项,如下面的例子x | k q t (所示:
let text = "cat,bat";
let pattern = /([bc])at/gi;
let matches = patterH K \n.exec(text);
//["cat", "c", index: 0, input: "cat,bat", groups: undefined]
cod * h ; 4 R L w nnsole.log(matcA S }hes.lastIndex); // 3
pattern.exec(text);
//["bat", "b", index: 4, input: "cat,bat", groups: undefined]
console.log(matches.lastIndex); // 7
pattern.exec(text);
/3 6 d x I/null
console.logU @ . M(match@ + i J b a z Des.lastIndex); // 0
注:如果模式设置了粘附标记y,则每次调用exec()就只会在 lastIndex的位置上寻c I j ( e V \找匹配项。(自动开启全局模式)
如果匹配中途结束,可以通过调整lastk | | m 3 4 3Index的属性值恢复匹配。
② test()
接收一个字符串参数。如果输入的文本与模式匹C P y R Q :配(完全匹配),则参数返回trG k s $ 5 V a ]ue,否则返回false。
当我们只关心是否匹配时可以使用test()。
③ 其他方法
-
toLocaleString()和toString() :返回i r : R = d *其字面量的字符串表示。
let r = /([bc])at/iy; console.lt ` i #og(r.toString()); // "/([bc])at/iy"
-
valueOf():返回正则表达式本身
2.4构造函数属性(静态属性)
RegExp也有几个静态属性 但不常用。略
2.字符串匹配
1.match()
本质与RegExp的exec() 方法相同。方法接收一个参数:正则表达式对象# _ 4 { } k = I,或表达式字符串
leL ? z 8t text = "cat,bat";
let pattern =+ g N p z B /(.)at/i;
let matches = text2 Z : | \ N g.match(pattern)
//let matches = pattern.exec(text); 等价
//["cat", "c", index: 0, input: "cat,bat", groups: undefined]
console.log(matches[0]); // "cat"
console.log(matches[1]); // "c"
console.log(matchesB P h 0 F $.lastIndk 2 i I Z h Q qex); //没有使用全局匹配,永远为0
2.search()
查找模式,方法接收一个参数:正则表达式对象,或表达式字符串。返回; # z Q { * r d模式第一个匹配的位置索引,如果没找到则返回-1。
let text = "cat, bat, sat, fat";
let pos = text.search(/at/);
console.log(pos); // 1
3.replace()
用于替换字符串e ! W \ M u u w,方法接收两个参数,第一个参数为RegExp对象或字符串、第3 ` K 3 | n \二个参数为字符串或函数。
-
第一个参数为字符串则只会替换第一个字符串,如果全W z $ \ a 2 k部替换,正则表达式必须带全局标记。
-
第二个参数是字符串时有几个特殊字符,可用来表示匹配到的值
$k m [ d { en:n为0-9,$1表示第一个捕获组的字2 x [符串let text = "bat, cat, fat, tat"; let pattern = /(.z 0 } * ,)a, - y J F R |t/g; let result = text.replace(pattern,"$1$1"); //$1表示分组1 也就是at前面的字符 console.log(result); //"bb, cc, ff, tt"
-
第二} B G W个参数是函数,函数会接收三个参数:匹配的整个字符串、匹配索引、整个字符串。(多个捕获组会传多次)。
函数应该返回一个字符串,表示替换内容。function htmlEscape(text) { return text.replace(/[<>"&]/g, functioU E T b Zn(matr p ? 1ch, pos, originalText) { switch(matc} - ] 1 k r sh) { cg ? C ~ase "<": return "<"; case ">": return "&1 o j 7 C n g;gt;"; case "&": return "&"; case "\""P a o 3 4 [ W Y: return "&j , / t w s S Q;quot;"; } }); } console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>")); // "<p class="greeting">Hello world!</p>"
4.split()
用于将字符串分割为数组,第一个参数可以是RegExp对象或字符串,第二个可选参数用于指定数组最大大小。
let colorText = "red,blue,grN 5 +een,yellow";
let colors[ f o k1 =, D G Q P I | k J colorText.split(",");
// ["red", "blue", "green", "yellow"]
let colorsg t f Y 2 $2 = colorText.split(",", 2);
// ["red", "blue"]
let colors3 = colorText.split(/[^,]+/O ? ? c P z [ | O);
// ["", ",", ",", ",", ""] 如果分隔符在开头和结尾出现,数组的前后就会出现空字符串元素