正则表达式总结

什么是正则表达式?

正则表达式(Regular Expression或Regex),是用于定义某种特定搜索模式的字符组合。正则表达式可用于匹配、查找和替换文本中的字符,进行输入数据的验证,查找英文单词的拼写错误等。

调试工具

https://regex101.com/
https://regexr.com/
https://www.regexpal.com/

规则总结

在Javascript中,一个正则表达式以 /开头和结尾,所以简单至 /hello regexp/ 就是一个正则表达式。

Flags(标志符或修饰符)

Flags写在结束的/之后,可以影响整个正则表达式的匹配行为。

  • g:全局匹配(global);正则表达式默认只会返回第一个匹配结果,使用标志符g则可以返回所有匹配
  • i:忽略大小写(case-insensitive);在匹配时忽略英文字母的大小写
  • m:多行匹配(multiline);将开始和结束字符(^和$)视为在多行上工作,即分别匹配每一行(由 \n\r 分割)的开始和结束,而不只是只匹配整个输入字符串的最开始和最末尾处

Character Sets(字符集合)

用于匹配字符集合中的任意一个字符

  • [xyz]:匹配 "x""y" "z"
  • [^xyz]:补集,匹配除 "x" "y" "z"的其他字符
  • [a-z]:匹配从 "a""z" 的任意字符
  • [^a-n]:补集,匹配除 "a""n" 的其他字符
  • [A-Z]:匹配从 "A""Z" 的任意字符
  • [0-9]:匹配从 "0""9" 的任意数字

Quantifiers (量词)

实现重复匹配

  • {n}:匹配 n
  • {n,m}:匹配 n-m
  • {n,}:匹配 >=n
  • ?:匹配 0 || 1
  • *:匹配 >=0 次,等价于 {0,}
  • +:匹配 >=1 次,等价于 {1,}

Metacharacters(元字符)

在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。

  • \d:匹配任意数字,等价于 [0-9]
  • \D:匹配任意非数字字符;\d 的补集
  • \w:匹配任意基本拉丁字母表中的字母和数字,以及下划线;等价于 [A-Za-z0-9_]
  • \W:匹配任意非基本拉丁字母表中的字母和数字,以及下划线;\w 的补集
  • \s:匹配一个空白符,包括空格、制表符、换页符、换行符和其他Unicode空格
  • \S:匹配一个非空白符;\s的补集
  • \b:匹配一个零宽单词边界,如一个字母与一个空格之间;例如,/\bno/ 匹配 "at noon" 中的 "no"/ly\b/ 匹配 "possibly yesterday." 中的 "ly"
  • \B:匹配一个零宽非单词边界,如两个字母之间或两个空格之间;例如,/\Bon/ 匹配 "at noon" 中的 "on"/ye\B/ 匹配 "possibly yesterday." 中的 "ye"
  • \t:匹配一个水平制表符(tab)
  • \n:匹配一个换行符(newline)
  • \r:匹配一个回车符(carriage return)

Special Characters (特殊字符)

  • \:转义字符,可以将普通字符转成特殊字符。比如 \w;也可以将特殊字符转成字面意思,比如 \+ 匹配 "+"
  • .:匹配任意单个字符,但是换行符除外:\n, \r, \u2028\u2029;在字符集中([.]),无特殊含义,即表示 '.' 的字面意思
  • |:替换字符(alternate character),匹配 | 前或后的表达式。比如需要同时匹配 "bear""pear",可以使用 /(b|p)ear/ 或者 /bear|pear/;但是不能用 /b|pear/,该表达式只能匹配 "b""pear"
  • ^:匹配输入的开始。比如,/^A/ 不匹配 "an Apple" 中的 "A",但匹配 "An apple" 中的 "A"
  • $:匹配输入的结尾。比如,/t$/ 不匹配 "eater" 中的 "t",但匹配 "eat" 中的 "t"^$ 在表单验证时常需要使用,因为需要验证从开始到结尾的一个完整输入,而不是匹配输入中的某一段

Groups(分组)

  • (xyz):捕获分组(Capturing Group),匹配并捕获匹配项;例如,/(foo)/ 匹配且捕获 "foo bar." 中的 "foo"。被匹配的子字符串可以在结果数组的元素 [1], ..., [n] 中找到,或在被定义的 RegExp 对象的属性 1, ...,9 中找到
  • (?:xyz):非捕获分组(Non-capturing Group),匹配但不会捕获匹配项;匹配项不能再次被访问到
  • \nn 是一个正整数,表示反向引用(back reference),指向正则表达式中第n个括号(从左开始数)中匹配的子字符串;例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"

Assertion(断言)

  • x(?=y):仅匹配被y跟随的x;例如,/bruce(?=wayne)/,如果"bruce"后面跟着wayne,则匹配之。/bruce(?=wayne|banner)/ ,如果"bruce"后面跟着"wayne"或者banner,则匹配之。但是,"wayne""banner" 都不会在匹配结果中出现
  • x(?!y):仅匹配不被y跟随的x;例如,/\d+(?!\.)/ 只会匹配不被 "." 跟随的数字。

应用

匹配手机号码

/^1[34578]\d{9}$//^1(3|4|5|7|8)\d{9}$/
因为使用捕获括号存在性能损失,所以推荐使用第一种写法

匹配电子邮件

标准的电子邮件组成为 <yourname>@<domain>.<extension><optional-extension>

  • yourname:/[a-z\d._-]+/
  • domain:/[a-z\d-]+/
  • extension: /[a-z]{2,8}/
  • optional-extension:/(\.[a-z]{2,8})?/
    /^([a-z\d._-]+)@([a-z\d-]+)\.([a-z]{2,8})(\.[a-z]{2,8})?$/

原文链接:还不会正则表达式?看这篇!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容