javascript正则表达式

字符匹配

  1. 常见匹配字符的元字符:

    • .匹配除换行符以外的任意字符。
    • \w匹配字母或数字或下划线或汉字。
    • \s匹配任意的空白符。
    • \d匹配数字。
    • \W匹配任意不是字母,数字,下划线,汉字的字符。
    • \S匹配任意不是空白符的字符。
    • \D匹配任意非数字的字符。
  2. [0-9][^abc]也都匹配一个字符。

位置匹配

  1. 除了匹配单个字符,还可以匹配位置。元字符^和$都匹配一个位置。
  2. 常见匹配位置的元字符:

    • \b匹配单词的开始或结束。
    • ^匹配字符串的开始。
    • $匹配字符串的结束。
    • \B匹配不是单词开头或结束的位置。
  3. 以下列字符串("abc def")为例:

    • ^可以匹配到位置0,该位置位于字符串开头。
    • $可以匹配到位置7,该位置位于字符串结尾。
    • \b可以匹配到位置0、位置3、位置4、位置7,这些位置位于单词开始或结束处。

image.png

分组

  1. ()通过小括号分组匹配多个字符。(abc)匹配abc三个字符。

重复匹配

  1. 限定符:

    • *重复零次或更多次。
    • +重复一次或更多次。
    • ?重复零次或一次。
    • {n}重复n次。
    • {n,}重复n次或更多次。
    • {n,m}重复n到m次。
  2. 重复单个字符。.+,[0-9]*
  3. 重复多个字符。(abc){2, 5}
  4. 默认的贪婪模式,尽可能多的匹配。例如,正则1.*3全局查找字符串12313,匹配结果为12313
  5. 限定符后面添加?,则匹配模式为非贪婪模式,尽可能少的匹配。例如,正则1.*3全局查找字符串12313,匹配结果为12313

条件匹配

1.(a|b)匹配包含ab的字符。
2.abc|def匹配包含abcdef的字符。
3.^abc|def$匹配abc开头或者def结尾的字符。
4.^(abc|def)$只匹配abcdef这两个字符。

引用

  1. ()指定子表达式后,匹配子表达式的文本(分组捕获的内容)可以在表达式或其它程序中作进一步的处理。
  2. 默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2。
  3. '<html></html>'.match(/<(.+?)><\/\1>/)\1代表分组1匹配的文本。
  4. (?<Name>)指定子表达式的组名(Name),\k<Name>引用捕获的内容。
  5. '<html></html>'.match(/<(?<tag>.+?)><\/\k<tag>>/)组名为tag。

零宽度断言

  1. 和\b,^,$相同,属于位置匹配,这个位置应该满足一定的条件。
  2. (?=exp)零宽度正预测先行断言,匹配的位置后面需要满足exp条件。比如\b\w+(?=ion\b),匹配谁后面有ion结尾,则查找position relative时,它会匹配posit
  3. (?<=exp)零宽度正回顾后发断言,匹配的位置前面需要满足exp条件。比如(?<=\bun)\w+\b,匹配谁前面有un开头,则查找see unreal时,它匹配real
  4. (?!exp)零宽度负预测先行断言,匹配的位置后面不满足exp条件。比如\abc(?!\d)匹配后面没有数字的abc,则查找abc1 abcd时,它匹配是后面的abc
  5. (?<!exp)零宽度正回顾后发断言,匹配的位置前面不满足exp条件。比如\(?<!\d)abc匹配前面没有数字的abc,则查找abc 1abc时,它匹配是前面的abc
  6. 12(?!\d)全局匹配下列字符串的过程:

    • 正则表达式的字符"1"获取控制权,开始配置字符,从第1个字符开始匹配,匹配字符"1"成功,然后控制权转交给"2",从第2个字符继续匹配,匹配成功,然后控制权转交给(?!\d),它从位置2开始匹配,要求位置后面不是数字,匹配成功。
    • 此时得到了第一个匹配结果,继续查找其他匹配结果。
    • 字符"1"重新获取控制权,从第3个字符开始匹配,匹配失败。
    • 字符"1"重新获得控制权,从第4个字符开始匹配,匹配成功,控制权转交给"2",从第5个字符继续匹配,匹配成功,然后控制权转交给(?!\d),匹配位置5,要求位置后面不是数字,而该位置后面是数字,匹配失败。
    • 字符"1"重新获取控制权,返回到第5个字符开始匹配,匹配失败。
    • 字符"1"重新获取控制权,从第6个字符开始匹配,匹配成功,控制权转交给字符"2",从第7个字符继续匹配,匹配成功,然后控制全交给(?!\d),匹配位置7,该位置后面不是数字,匹配成功。
    • 此时得到了第二个匹配结果,整个字符串也查找结束。
    • 最终配置的结果就是该字符串前后的12,不匹配中间的12

image0.png

'12a1212'.match(/12(?!\d)/g)
// ["12", "12"]

7.根据断言在某个位置插入值

`{{deviceData.diskUsage}}`.replace(/(?<=\{\{[a-zA-Z\s\.]+)(?=\}\})/, ' | deVal')
// "{{deviceData.diskUsage | deVal}}"

常见正则表达式校验

  1. IP: ^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$;
  2. MAC: ^([0-9A-F]{2}:){5}[0-9A-F]{2}$;
  3. 中文及中文字符:[\u2E80-\u2EFF\u2F00-\u2FDF\u3000-\u303F\u31C0-\u31EF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FBF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF]

小正
42 声望4 粉丝