RegExp表达式的方法

exec

1
2
3
4
5
6
7
8
9
10
11
function render(template, data) {
var reg = /\{\{(\w+)\}\}/
if (reg.test(template)) {
const name = RegExp.$1.trim() // name = reg.exec(template)[1]
template = template.replace(reg, data[name])
return render(template, data)
}
return template
}
// 测试
render(`{{msg}}-{{name}}`, {msg: 'chendap', name: 'wmh'}) // chendap-wmh

test

  • 回文字符串
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var isPalindrome = function(s) {
    if(typeof s != 'string') return s = s.toString()
    if(s.length < 2) return true
    var r = /[^a-zA-Z0-9]/ig;
    s = s.replace(r, '').toLowerCase()
    return s == s.split('').reverse().join('')
    };
    // test
    isPalindrome('cppc') // true

驼峰转换

1
2
3
4
5
// content-type => contentType
// transform
function transform(word) {
return word.replace(/[-|_|@]([\w])/g, (match, p) => p.toUpperCase())
}

描述字符

元字符
元字符 描述
. 查找单个字符,除了换行和行结束符
\w 查找单词字符
\W 查找非单词字符
\d 查找数字
\D 查找非数字字符
\s 查找空白字符
\S 查找非空白字符
\b 匹配单词边界
\B 匹配非单词边界

描述字符范围

在正则表达式语法中,放括号表示字符范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符~表示。如果在方括号内添加脱字符^前缀,还可以表示范围之外的字符。例如:
[abc]:查找方括号内任意一个字符。
[^abc]:查找不在方括号内的字符。
[0-9]:查找从 0 至 9 范围内的数字,即查找数字。
[a-z]:查找从小写 a 到小写 z 范围内的字符,即查找小写字母。
[A-Z]:查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。
[A-z]:查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。

选择匹配

选择匹配类似于 JavaScript 的逻辑与运算,使用竖线|描述,表示在两个子模式的匹配结果中任选一个。例如:

1) 匹配任意数字或字母
var r = /\w+|\d+/;
2) 可以定义多重选择模式。设计方法:在多个子模式之间加入选择操作符。
var r = /(abc)|(efg)|(123)|(456)/;

重复匹配

在正则表达式语法中,定义了一组重复类量词,如表所示。它们定义了重复匹配字符的确数或约数。

重复类量词列表
量词 描述
n+ 匹配任何包含至少一个 n 的字符串
n* 匹配任何包含零个或多个 n 的字符串
n? 匹配任何包含零个或一个 n 的字符串
n{x} 匹配包含 x 个 n 的序列的字符串
n{x,y} 匹配包含最少 x 个、最多 y 个 n 的序列的字符串
n{x,} 匹配包含至少 x 个 n 的序列的字符串

示例

var s = "ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle goooooooogle";

1.如果仅匹配单词 ggle 和 gogle,可以设计:

1
2
var r = /go?gle/g;
var a = s.match(r)

量词?表示前面字符或子表达式为可有可无,等效于

1
2
var r = /go{0,1}gle/g;
var a = s.match(r);

2.如果匹配第 4 个单词 gooogle,可以设计:

1
2
var r = /go{3}gle/g;
var a = s.match(r);

等效于:

1
2
var r = /gooogle/g;
var a = s.match(r);

3.如果匹配第 4 个到第 6 个之间的单词,可以设计:

1
2
var r = /go{3,5}gle/g;
var a = s.match(r);

4.如果匹配所有单词,可以设计:

1
2
var r = /go*gle/g;
var a = s.match(r);

量词*表示前面字符或表达式可以不出现,或者重复出现任意多次。等效于:

1
2
var r = /go(0,)gle/g;
var a = s.match(r);

5.如果匹配包含字符“o”的所有词,可以设计:

1
2
3
4
5
6
7
8
9
10
11
var r = /go+gle/g;
var a = s.match(r);
// array(8)
0: "gogle"
1: "google"
2: "gooogle"
3: "goooogle"
4: "gooooogle"
5: "goooooogle"
6: "gooooooogle"
7: "goooooooogle"

相当于

1
2
var r = /go{1,}gle/g;
var a = s.match(r);

惰性匹配

重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。
?、{n} 和 {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。
*、+ 和 {n,} 重复类具有强贪婪性,表现为贪婪的无限性。

边界量词

边界就是确定匹配模式的位置,如字符串的头部或尾部,具体说明如表所示。
JavaScript 正则表达式支持的边界量词
量词 说明
^ 匹配开头,在多行检测中,会匹配一行的开头
$ 匹配结尾,在多行检测中,会匹配一行的结尾

示例

var s = "how are you"

匹配最后一个单词

1
2
var r = /\w+$/;
var a = s.match(r); //返回数组["you"]

匹配第一个单词

1
2
var r = /^\w+/;
var a = s.match(r); //返回数组["how"]

参考