js正则表达式全局匹配正斜杠_JavaScript正则表达式常⽤技巧
正则表达式是⽤于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被⽤于 RegExp 的 exec 和 test ⽅法, 以及 String 的 match、matchAll、replace、search 和 split ⽅法。正则表达式的掌握程度能粗略地看出程序员的技术底⼦,所以技术⾯试、编程竞赛等 都特别喜欢考察正则表达式。本篇就带你⼀起夯实⼀下 JavaScript 正则表达式的⼀些使⽤技巧:
创建正则表达式
在 JavaScript 的世界,创建正则表达式有2个⽅法: (1)使⽤⼀个正则表达式字⾯量,其由包含在斜杠之间的模式组成。⽐如 :
const reg = /ab+c/
(2)调⽤RegExp对象的构造函数。⽐如:
const reg = new RegExp("ab+c")
注意:以上2个⽅法虽然都能创建正则表达式,但是还是有区别的: (1)使⽤第⼀个⽅法,在脚本加载后正则表达式字⾯量就会被编译。当正则表达式保持不变时,使⽤此⽅法可获得更好的性能。 (2)使⽤第⼆个⽅法,在脚本运⾏过程中⽤构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从⽤户输⼊等来源中动态地产⽣,就需要使⽤构造函数来创建正则表达式。
当然,这样表述可能不太深刻,下⾯⼀道⾯试题带你实践⼀下。
经典⾯试题 "Word Finder"
题⽬要求:
使⽤⼀个⽅法来扩展字典,该⽅法返回与模式匹配的单词列表。这个模式可以包含字母(⼩写)和占位符("?")。占位符只代表⼀个任意的字母,⽐如:
const fruits = new Dictionary(['banana', 'apple', 'papaya', 'cherry']);
补充说明:
(1)单词和模式都是⼩写
(2)返回单词的顺序⽆关紧要
上⾯这道题⽬是典型的 正则表达式应⽤题,考察的知识点是2个: (1)使⽤ RegExp 对象 动态创建正则表达式 (2)使⽤ /./ 匹配⼀个任意字符
因此不难有如下解决⽅案(ps:这个是我的解决⽅案,虽然解法⽐较low,但是逻辑应该还算清晰,容易理解)
// 字典构造器
function Dictionary(words) {
this.words = words;
}
// 原型⾥拓展解法
MatchingWords = function(pattern) {
let res = []
const reg = new RegExp("^" + place(/?/g, '.') + "$") // 创建正则表达式
for (let x of this.words) {
if (st(x)) res.push(x)
}
return res
}
如果你有更好的解法,欢迎评论留⾔哈 ^_^
正则表达式模式
⼀个正则表达式模式是由简单的字符所构成的,⽐如 /abc/;或者是简单和特殊字符的组合,⽐如 /ab*c/ 或 /Chapter (d+).d*/
简单模式
简单模式是由想要匹配的具体字符组成,且严格匹配字符顺序。⽐如,/abc/ 这个模式就能且仅能匹配 "abc" 字符按照顺序同时出现的情况,⽽ "bac" 或 "cab" 等就⽆法匹配。
特殊字符
当需要匹配⼀个不确定的字符串时,⽐如寻⼀个或多个 "b",或者寻空格,可以在模式中使⽤特殊
字符。特殊字符还包括如下:断⾔:表⽰⼀个匹配在某些条件下发⽣。断⾔包括先⾏断⾔、后⾏断⾔和条件表达式
字符类:区分不同类型的字符,例如区分字母和数字
组和范围:表⽰表达式字符的分组和范围
javascript全局数组量词:表⽰匹配的字符或条件表达式的数量
Unicode属性转义:基于 Unicode字符属性区分字符,例如⼤写和⼩写字母、数字符合和标点
Escaping
当需要使⽤任何特殊字符的字⾯值(例如,搜索字符 *),你必须通过在它前⾯放⼀个反斜杠来转义它。 例如,要搜索'a'后跟*后跟'b',你应该使⽤ /a*b/- 反斜杠“转义”字符 *,使其成为⽂字⽽⾮特殊符号。将⽤户输⼊转义为正则表达式中的⼀个字⾯字符串,可以通过简单的替换来实现:
function escapeRegExp(string) {
place(/[.*+?^${}()|[]]/g, "$&"); //$&表⽰整个被匹配的字符串
}
使⽤正则表达式
前⾯讲到,正则表达式可以被⽤于 RegExp 的 exec 和 test ⽅法以及 String 的 match、replace、search 和 split ⽅法。这些⽅法在JavaScript ⼿册 中有详细的解释,下⾯只简单罗列下各⾃功能,不做展开:
exec:在字符串中执⾏查匹配的 RegExp ⽅法,它返回⼀个数组(未匹配到则返回 null)
test:在字符串中测试是否匹配的 RegExp ⽅法,它返回 true 或 false
match:在字符串中执⾏查匹配的 String ⽅法,它返回⼀个数组,在未匹配到时会返回 null
matchAll:在字符串中执⾏查所有匹配的 String ⽅法,它返回⼀个迭代器(iterator)
search:在字符串中测试匹配的 String ⽅法,它返回匹配到的位置索引,或者在失败时返回 -1
replace:在字符串中执⾏查匹配的 String ⽅法,并且使⽤替换字符串替换掉匹配到的⼦字符串
split:使⽤正则表达式或者⼀个固定字符串分隔⼀个字符串的String⽅法,并将分隔后的⼦字符串存储
到数组中
⼀个简单的快速记忆⽅法: (1)想要知道在⼀个字符串中的⼀个匹配是否被到,使⽤ test 或 search ⽅法 (2)想得到更多的信息(但是⽐较慢)则可以使⽤ exec 或 match ⽅法
举个栗⼦,使⽤exec⽅法在⼀个字符串中查⼀个匹配:
const myRe = /d(b+)d/g;
const myArray = ("cdbbdbsbz");
如果不需要访问正则表达式的属性,这个脚本通过另⼀个⽅法来创建myArray:
const myArray = /d(b+)("cdbbdbsbz");
// 和 "cdbbdbsbz".match(/d(b+)d/g); 相似。
// 但是 "cdbbdbsbz".match(/d(b+)d/g) 输出数组 [ "dbbd" ],
// ⽽ /d(b+)('cdbbdbsbz') 输出数组 [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].
如果想通过⼀个字符串构建正则表达式,那么这个脚本还有另⼀种⽅法:
const myRe = new RegExp("d(b+)d", "g");
const myArray = ("cdbbdbsbz");
使⽤括号的⼦字符串匹配
⼀个正则表达式模式使⽤括号,将导致相应的⼦匹配被记住。例如,/a(b)c / 可以匹配字符串“abc”,并且记得“b”。回调这些括号中匹配的⼦串,使⽤数组元素[1],……[n]。
使⽤括号匹配的⼦字符串的数量是⽆限的。返回的数组中保存所有被发现的⼦匹配。下⾯的例⼦说明了如何使⽤括号的⼦字符串匹配。
下⾯的脚本使⽤ replace() ⽅法来转换字符串中的单词。在匹配到的替换⽂本中,脚本使⽤替代的$1, $2 表⽰第⼀个和第⼆个括号的⼦字符串匹配:
const re = /(w+)s(w+)/;
const str = "John Smith";
const newstr = place(re, "$2, $1");
console.log(newstr); // 输出 "Smith, John"
通过标志进⾏⾼级搜索
正则表达式有六个可选参数 (flags) 允许全局和不分⼤⼩写搜索等。这些参数既可以单独使⽤也能以任意顺序⼀起使⽤, 并且被包含在正则表达式实例中:
g:全局搜索
i:不区分⼤⼩写搜索
m: 多⾏搜索
s:允许.匹配换⾏符
u:使⽤Unicode码的模式进⾏匹配
y:执⾏“粘性(sticky)”搜索, 匹配从⽬标字符串的当前位置开始
例如,re = /w+s/g 将创建⼀个查⼀个或多个字符后有⼀个空格的正则表达式,或者组合起来像此要求的字符串:
const re = /w+s/g;
const str = "fee fi fo fum";
const myArray = str.match(re);
console.log(myArray);
// ["fee ", "fi ", "fo "]
使⽤ .exec() ⽅法时,与 g 标志关联的⾏为是不同的。 (“class”和“argument”的作⽤相反:在.match()的情况下,字符串类(或数据类型)拥有该⽅法,⽽正则表达式只是⼀个参数,⽽在.exec()的情况下,它是拥有该⽅法的正则表达式,其中字符串是参数。对
⽐str.match(re)与re.exec(str) ), g标志与.exec()⽅法⼀起使⽤获得迭代进展:
const xArray; while(xArray = re.exec(str)) console.log(xArray);
// produces:
// ["fee ", index: 0, input: "fee fi fo fum"]
// ["fi ", index: 4, input: "fee fi fo fum"]
// ["fo ", index: 7, input: "fee fi fo fum"]
除此之外,m标志⽤于指定多⾏输⼊字符串应该被视为多个⾏。如果使⽤m标志,^和$匹配的开始或结束输⼊字符串中的每⼀⾏,⽽不是整个字符串的开始或结束。
@参考:正则表达式
本⽂由博客⼀⽂多发平台 OpenWrite 发布!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论