js中的正则表达式
正则表达式:用于匹配字符串中 字符组合 的模式。
js中的正则表达式可以用于RegExp
的 exec
和 test
方法, 以及 String
的 match
、matchAll
、replace
、search
、split
方法。
1. 创建正则表达式
-
使用正则表达式字面量创建
var re = /ab+c/;
-
使用**
RegExp
**对象的构造函数var re = new RegExp("ab+c");
2. 正则表达式中的特殊字符
-
表示字符
字符 含义 \d 匹配一个数字 \D 匹配一个非数字 \w 匹配一个单字字符(数字、字母或下划线) \W 匹配一个非单字字符(非数字、字母或下划线) \s 匹配一个空白字符(空格、制表符、换页符、换行符) \S 匹配一个非空白字符(非空格、制表符、换页符、换行符) . 小数点。默认匹配除换行符之外的任何单个字符 \ ① 配合字母表示特定含义;如:\d \w等
② 在特殊字符前表示下一个字符不是特殊字符,按字面意思理解 -
表示数量(量词)
字符 含义 + 匹配前面一个表达式一次或多次 * 匹配前一个表达式0次或多次 {n} n为正整数,匹配前面一个字符刚好出现 n 次 {n, } n为正整数,匹配前面一个字符至少出现 n 次 {n, m} n 和 m 都是整数,匹配前面的字符至少 n 次,最多 m 次 ? 匹配前一个表达式 0 次 或 1 次。等价于 {0, 1} -
其他特殊字符
字符 含义 ^ ① 以其后的字符开始 $ 以其前面的字符结尾 [xyz] 一个字符集合。匹配集合中的任意一个字符,可以使用 **-**来指定范围。如:[0-9] 表示匹配 0-9 的任意一个数字 [^xyz] 一个反向字符集合。匹配任何没有包含在方括号中的字符,可以使用 **-**来指定范围。如:[ ^0-9 ] 表示匹配 除0-9 的任意一个字符 x | y 匹配 x 或者 y (? : x) 其后的量词可以作用于整个模式 x x(?=y) 匹配 x ,其后面的模式为 y (?<=y)x 匹配 x ,x 前面的模式为 y x (?!y) 匹配 x ,仅当 x 后面的模式不为 y -
规则末尾的修饰符
字符 英文 含义 g global 全局匹配 i ignoreCase 忽略大小写匹配 m multiline 换行匹配
3. 使用正则表达式的方法
-
正则对象的方法
- test()
// test() 判断字符串中是否 含有 符合规则的 某个或某段字符 有=> true, 没有=>false var str = "good good study , Day dAy up"; var reg = /day/i; var result = reg.test(str); console.log(result); // true
注意:
// 正则对象存在属性 lastIndex,会记录每一次匹配符合规则的第一个字符的下标,下一次再调用 test() 方法,会从 记录的 lastIndex 开始往后查找,默认为 0 var str = "good good study , Day dAy up"; var reg = /day/ig; console.log(reg.lastIndex); // 0 var result = reg.test(str); console.log(result, reg.lastIndex); // true 21 var result = reg.test(str); console.log(result, reg.lastIndex); // true 25 var result = reg.test(str); console.log(result, reg.lastIndex); // false 0 var result = reg.test(str); console.log(result, reg.lastIndex); // true 21
- exec()
// exec 类似match方法 将符合规则的某个或某段字符提取出来放到数组中(始终只匹配一次) var str = "good good study , Day dAy up"; var reg = /day/i; var arr = reg.exec(str); console.log(arr); // test.html:56 ["Day", index: 18, input: "good good study , Day dAy up", groups: undefined]
-
字符串的方法
-
str.match(reg)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/match
// 参数:reg(正则表达式对象) // 如果传入一个非正则表达式对象,会隐式的转换为一个正则对象,如果不输入参数,会返回 包含空字符串的数组 [""] // 返回值: // 如果规则包含 g,返回与完整正则表达式匹配的所有结果 // 如果不包含 g,返回第一个完整匹配及其相关的 捕获组 (捕获组:(x) x 模式的字符集合)
var str = 'For more information, see Chapter 3.4.5.1'; var re = /see (chapter \d+(\.\d)*)/i; var found = str.match(re); console.log(found); // logs [ 'see Chapter 3.4.5.1', // 'Chapter 3.4.5.1', // 捕获组 // '.1', // 捕获组 // index: 22, // input: 'For more information, see Chapter 3.4.5.1' ] // 'see Chapter 3.4.5.1' 是整个匹配。 // 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕获。 // '.1' 是被'(\.\d)'捕获的最后一个值。 // 'index' 属性(22) 是整个匹配从零开始的索引。 // 'input' 属性是被解析的原始字符串。
-
str.matchAll(reg)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll
// 参数:reg(正则表达式对象) // 如果传入一个非正则表达式对象,会隐式的转换为一个正则对象 注:RegExp必须是设置了全局模式 g 的形式 // 返回值: // 一个迭代器:包含所有匹配正则表达式的结果及分组捕获组的迭代器
const regexp = /t(e)(st(\d?))/g; const str = 'test1test2'; const array = [...str.matchAll(regexp)]; console.log(array[0]); // expected output: Array ["test1", "e", "st1", "1"] console.log(array[1]); // expected output: Array ["test2", "e", "st2", "2"]
-
str.replace(regexp|substr, newSubStr|function)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace
// 参数: // regexp:正则表达式对象 // substr:需要替换的字符串 // newSubStr:新的字符串 // function:接收一个函数,函数的返回值作为替换的字符串 // 返回值: // 替代之后的新字符串
var str = 'Twas the night before Xmas...'; var newstr = str.replace(/xmas/i, 'Christmas'); console.log(newstr); // Twas the night before Christmas...
-
str.search(reg)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/search
// 参数:reg(正则表达式对象) // 如果传入一个非正则表达式对象,会隐式的转换为一个正则对象,如果不输入参数,会返回 0 ("number") // 返回值: // 如果匹配成功,则 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
-
str.split(reg)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/split
// split() 字符串的分割 (用特定的字符将字符串 分割为数组) var str = "a-b-c-d-e-f"; var arr = str.split("-"); // ["a", "b", "c", "d", "e", "f"] var arr = str.split(""); // 任意两个字符之间 分割 // ["a", "-", "b", "-", "c", "-", "d", "-", "e", "-", "f"]
var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand "; console.log(names); // Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand var re = /\s*(?:;|$)\s*/; // 匹配 左边不限数量空格,中间为 ; 或 $ ,右边不限数量的空格 var nameList = names.split(re); console.log(nameList); // [ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]
-