正则、字符实体

653 阅读3分钟

特殊字符

行终结符:\n(换行符) 、\r(回车符) 、\u2028(行分隔符) 、\u2029(段落分隔符)

. :匹配除了行终结符之外的单个字符

/a.\d/.test('aaa1000') //true,匹配到的:aa1

? :表示0/1 个

$:匹配最后一个字符后的内容,即空字符串。要匹配 "$" 字符本身,请使用 "\$"

\d:任意一个数字,0~9 中的任意一个

\D:匹配非数字的字符

\w:任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

\W:匹配除字母、数字、下划线以外的字符

\s:包括空格、制表符、换页符等空白字符的其中任意一个

\S:匹配非空字符,\s\S就表示匹配所有字符

\b:匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 (它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。只是将所在缝隙之前、之后的字符取来进行了一下判断)

\B:匹配非单词边界,即两边都是\w或都不是\W

匹配到的有:b、2(它的两边都是\w)、@、#、$、%(它的两边都不是\w)

"^""$""\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,
只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。

惰性匹配(贪婪与非贪婪模式)

如果在数量词*、+、? 或 {}, 任意一个后面紧跟该符号(?),可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "匹配少一点",叫做非贪婪即勉强模式

如果少匹配就会导致整个表达式匹配失败的时候,则会尽最大程度的匹配,即贪婪模式

console.log("aaabc".replace(/a+/g, "d")); // dbc

console.log("aaabc".replace(/a+?/g, "d")); // dddbc

正向预查与反向预查

以下规则只匹配符合规则的间隙,若在以下规则还紧接着其他规则,则在符合规则的间隙后找

(?:pattern):加了?:只后,()内匹配到的内容不作为子匹配内容,不被记录下来

let reg=/industr(?:y|ies)i/
let reg1=/industr(y|ies)i/

"industry".match(reg)   //industry
"industry".match(reg1)  //industry,$1:y(子匹配项)

(?=pattern):所在缝隙的右侧,必须能匹配上pattern,但pattern不作为匹配到的内容

(?!pattern):所在缝隙的右侧,不能匹配上pattern

(?<=pattern):所在缝隙的左侧,必须能匹配上pattern

(?<=\d{4})\d+(?=\d{4})
"1234567890123456":匹配到:除了前四个和后四个数字

只匹配间隙,不会影响后边的表达式来真正的匹配

Reg:(\w)((?=\1\1\1)(\1))+
"aaa ffffff 999999999"
匹配结果:ffff  9999999

表示的含义:可以看成是一个字符重复4次的话,就取前两个
比如:\w匹配‘f',然后\1表示第一个括号匹配到的,
      ?=\1\1\1,则表示某个间隙后是跟3个‘f',到这里就已经匹配了第一个‘f'和f后面的间隙,
      然后还有一个\1,则匹配间隙后的内容为'f'的字符

在线测试

实现千分符, 将一个数值以千分位表示,即1223456789表示为1,223,456,789

function f(num){
    num=num.toString();
    let reg=/(?=(?!\b)(\d{3})+$)/g
    return num.replace(reg,function($0){
        return ","
    })
}
console.log(f(1312567));    //1,312,567

这个正则是为了找到后面跟着的数字的个数是3或3的倍数的空隙的地方,在这个地方加上“,”

防止这个数字的个数是3的整数倍,如果没有写”?!\b"的话,在这个数字的开头也会添加上","。

加$(匹配字符结尾的位置)的原因是要因为匹配到的地方的后面跟着的数字的个数需要是3的倍数,否则只要后面有三个数字就会加上“,”,最终得到1,3,1,2,567

[pattern]

[abcd]:匹配a或b或c或d

[^?&=]:匹配? & = 之外的字符

exec和match

  • exec是正则对象reg的方法,返回一个数组,数组的第0个元素存放的是匹配到的文本,第1个元素是第一个子表达式(即括号内的内容)匹配到的文本,以此类推。如果没有匹配到文本,则返回null
    • 如果reg是全局匹配的话(即指定匹配模式为g),reg会在lastIndex属性(初始为0)指定的字符开始检索字符串,找到第一个匹配到的文本之后,会把reg的lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。所以可以循环使用exec()方法找到所有匹配到的文本
    • 如果要用reg去匹配另一个字符串,需要将reg的lastIndex属性手动设为0
  • match是字符串的方法,返回一个数组,如果regexp的标准没有g,则只会在字符串中执行一次匹配,返回的数组的元素和exec()没有全局匹配的情况是一样的。
    • 如果没有g,则返回的数组中还存放index属性和input属性
    • 如果有g,则数组只会存放所有匹配到的子串,而且也没有index属性或input属性
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["b=2", "b", "2", index: 25, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["c=3", "c", "3", index: 29, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //null
reg.lastIndex = 0;  //这段代码很重要哦,注意理解
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/;
var result = url.match(reg);
console.log(result);    //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(result.index);  //21
console.log(result.input);  //http://www.baidu.com?a=1&b=2&c=3
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
var result = url.match(reg);
console.log(result);    //["a=1", "b=2", "c=3"]
console.log(result.index);  //undefined
console.log(result.input);  //undefined

字符实体:字符的unicode

underscore 系列之字符实体与 _.escape