一、正则表达式的创建
1、通过new RegExp()创建
var 变量名 = new RegExp(/表达式/);
var reg = new RegExp(/123/);
var reg = new RegExp("white","g");
调用 RegExp 对象的构造函数来创建
2、通过字面量创建
var 变量名=/表达式/;
,由斜杠/
包围而不是引号包围,不需要加引号,不管是数值型还是字符串型。
I.简单模式:只能表示具体的匹配
var reg=/123/;
var reg=/white/g;
II.复合模式:可以使用通配符表达更为抽象的规则模式
var reg=/^\w+$/;
var reg=/^\w+@\w+.[a-zA-Z]{2,3}(.[a-zA-Z]{2,3})?$/;
二、正则表达式的使用
方法 | RegExp方法 |
---|---|
exec() | 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)。 |
test() | 一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false。 |
方法 | String方法 |
---|---|
match() | 一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。 |
matchAll() | 一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。 |
search() | 一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。 |
replace() | 一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。 |
split() | 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String 方法。 |
1、regexObj.exec()
语法:regexObj.exec(str)
regexObj
为编写的正则表达式str
为被测试的文本- 返回一个结果
数组
或null
const regex1 = RegExp('foo*', 'g');
const str1 = 'table football, foosball';
let array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
// "Found foo. Next starts at 9."
// "Found foo. Next starts at 19."
}
2、regexObj.test()
语法:regexObj.test(str)
regexObj
为编写的正则表达式str
为被测试的文本- 结果返回
true
/false
,用来检测str 文本是否符合我们写的正则表达式规范
var reg=/123/;
reg.test(123); //true
reg.test('123'); //true
reg.test('1234'); //true
reg.test('z'); // false
3、str.match()
语法:str.match(regexp)
regexp
为编写的正则表达式str
为被测试的字符串- 返回一个结果
数组
或null
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var regexp = /[A-E]/gi;
var matches_array = str.match(regexp);
console.log(matches_array);
// ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
var str = "Nothing will come of nothing.";
str.match(); // returns [""]
4、str.matchAll()
语法:str.matchAll(regexp)
regexp
为编写的正则表达式str
为被测试的字符串- 返回一个迭代器(不可重用,结果耗尽需要再次调用方法,获取一个新的迭代器)
const regexp = RegExp('[a-c]','');
const str = 'abc';
Array.from(str.matchAll(regexp), m => m[0]);
// Array [ "a" ]
5、str.search()
语法:str.search(regexp)
regexp
为编写的正则表达式str
为被测试的字符串- 如果匹配成功,则 search() 返回正则表达式在字符串中
首次匹配项的索引
;否则,返回-1
var str = "hey JudE";
var re = /[A-Z]/g;
var re2 = /[.]/g;
console.log(str.search(re)); // returns 4, which is the index of the first capital letter "J"
console.log(str.search(re2)); // returns -1 cannot find '.' dot punctuation
6、str.replace()
语法:str.replace(regexp|substr, newSubStr|function)
一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
regexp (pattern)
一个RegExp 对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉。substr (pattern)
一个将被 newSubStr 替换的 字符串。其被视为一整个字符串,而不是一个正则表达式。仅第一个匹配项会被替换。newSubStr (replacement)
用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。参考下面的使用字符串作为参数。return
一个部分或全部匹配由替代模式所取代的新的字符串
var re = /apples/gi;
var str = "Apples are round, and apples are juicy.";
var newstr = str.replace(re, "oranges");
// oranges are round, and oranges are juicy.
console.log(newstr);
下面的例子演示了如何交换一个字符串中两个单词的位置,这个脚本使用$1 和 $2 代替替换文本。
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);
7、str.split()
语法:str.split([separator[, limit]])
separator
指定表示每个拆分应发生的点的字符串。limit
一个整数,限定返回的分割片段数量return
源字符串以分隔符出现位置分隔而成的一个 Array
var myString = "Hello World. How are you doing?";
var splits = myString.split(" ", 3);
console.log(splits);//["Hello", "World.", "How"]
下例中,split() 方法会查找“0 或多个空白符接着的分号,再接着 0 或多个空白符”模式的字符串,找到后,就将空白符从字符串中移除,nameList 是 split 的返回数组。
var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";
console.log(names);
var re = /\s*(?:;|$)\s*/;
var nameList = names.split(re);
console.log(nameList);
上例输出两行,第一行输出原始字符串,第二行输出结果数组。
Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
[ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]
三、正则表达式的组成
一个正则表达式可以由简单字符构成
,比如/abc/
,也可以是简单和特殊字符的组合
,比如/ab * c/
,其中特殊符号
也被称为元字符
,在正则表达式中是具有特殊意义的专用符号,如^
、$
、+
等
符号 | 意义 |
---|---|
/…/ | 代表一个模式的开始和结束 |
^ | 匹配字符串的开始,例如 /^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。 |
$ | 匹配字符串的结束,例如 /t$/ 并不会匹配 “eater” 中的 ‘t’,但是会匹配 “eat” 中的 ‘t’。 |
\n | 匹配一个换行符 (U+000A)。 |
\r | 匹配一个回车符 (U+000D)。 |
\s | 任何空白字符 |
\S | 任何非空白字符 |
\d | 匹配一个数字字符,等价于[0-9],/\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的’2’ |
\D | 除了数字之外的任何字符,等价于[^0-9],/\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的’B’ 。 |
\w | 匹配一个数字、下划线或字母字符,等价于[A-Za-z0-9_] |
\W | 任何非单字字符,等价于[^a-zA-z0-9_] |
. | (小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不会匹配 ‘nay’。 |
{n} | 匹配前一项n次 |
{n,} | 匹配前一项n次,或者多次 |
{n,m} | 匹配前一项至少n次,但是不能超过m次 |
n* | 匹配前一项0次或多次,等价于{0,},例如/bo*/ 会匹配 “A ghost boooooed” 中的 ‘booooo’ 和 “A bird warbled” 中的 ‘b’,但是在 “A goat grunted” 中不会匹配任何内容。 |
n+ | 匹配前一项1次或多次,等价于{1,},/a+/ 会匹配 “candy” 中的 ‘a’ 和 “caaaaaaandy” 中所有的 ‘a’,但是在 “cndy” 中不会匹配任何内容。 |
n? | 匹配前一项0次或1次,也就是说前一项是可选的,等价于{0,1},例如,/e?le?/ 匹配 “angel” 中的 ‘el’、“angle” 中的 ‘le’ 以及 "oslo’ 中的 ‘l’。 |
x|y | 匹配‘x’或者‘y’。例如 /green|red/ 匹配“green apple”中的‘green’和“red apple”中的‘red’ |