还不会正则表达式?看这篇!

摘要: 正则表达式入门教程。javascript

Fundebug经受权转载,版权归原做者全部。java

正则表达式是不少程序员,甚至是一些有了多年经验的开发者薄弱的一项技能。你们都不少时候都会以为正则表达式难记、难学、难用,但不能否认的是正则表达式是一项很重要的技能,全部我将学习和使用正则表达式时的关键点整理以下,供你们参考。程序员

不一样语言中的正则表达式写法有少量差别,本文将使用 Javascript 中的语法。正则表达式

什么是正则表达式?

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

调试工具

下面列出了几款优秀的在线调试工具,若是你想建立或者调试正则表达式可能会须要。我的比较偏好Regex101,regex101 支持在正则表达式的不一样 flavor 之间切换、解释你的正则表达式、显示匹配信息、提供经常使用语法参考等功能,很是强大。编程

开始

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

Flags(标志符或修饰符)

Flags 写在结束的/以后,能够影响整个正则表达式的匹配行为。常见的 flags 有:segmentfault

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

Flags 能够组合使用,如:微信小程序

Character Sets(字符集合)

用于匹配字符集合中的任意一个字符,常见的字符集有:数组

  1. [xyz]:匹配 "x""y"``"z"
  2. [^xyz]:补集,匹配除 "x" "y" "z"的其余字符
  3. [a-z]:匹配从 "a""z" 的任意字符
  4. [^a-n]:补集,匹配除 "a""n" 的其余字符
  5. [A-Z]:匹配从 "A""Z" 的任意字符
  6. [0-9]:匹配从 "0""9" 的任意数字

好比匹配全部的字母和数字能够写成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i

Quantifiers (量词)

在实际使用中,咱们经常须要匹配同一类型的字符屡次,好比匹配 11 位的手机号,咱们不可能将 [0-9] 写 11 遍,此时咱们可使用 Quantifiers 来实现重复匹配。

  1. {n}:匹配 n
  2. {n,m}:匹配 n-m
  3. {n,}:匹配 >=n
  4. ?:匹配 0 || 1
  5. *:匹配 >=0 次,等价于 {0,}
  6. +:匹配 >=1 次,等价于 {1,}

Metacharacters(元字符)

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

常见的元字符有:

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

Special Characters (特殊字符)

正则中存在一些特殊字符,它们不会按照字面意思进行匹配,而有特殊的意义,好比前文讲过用于量词的?*+。其余常见的特殊字符有:

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

Groups(分组)

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

Assertion(断言)

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

推荐你们使用Fundebug,一款很好用的 BUG 监控工具~

应用

上面罗列出了这么多正则表达式的语法和规则,能够在必定程度上帮助咱们分析和理解一段正则表达式的做用,可是如何将这些规则组合并创造出有特定做用的表达式还须要咱们本身多加练习,下面举几个例子来讲明运用这些规则。

1. 匹配手机号码

咱们先从比较简单的匹配手机号码开始。目前国内的手机号码是1(3/4/5/7/8)开头的 11 位数字,所以手机号码的正则能够分解为如下几部分:

  1. 1 开头:/^1/
  2. 第 2 位为三、四、五、七、8中的一个:/[34578]//(3|4|5|7|8)/
  3. 剩余 3-11 位均为数字,并以数字结尾:/\d{9}$/

组合起来即为 /^1[34578]\d{9}$//^1(3|4|5|7|8)\d{9}$/,由于使用捕获括号存在性能损失,因此推荐使用第一种写法。

2. 匹配电子邮件

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

每部分的格式标准为(进行了相应的简化,主要为展现如何书写正则):

  1. yourname:任意英文字母(a-z/A-Z)、数字(0-9)、下划线(_)、英文句点(.)、连字符(-),长度大于 0
  2. domain:任意英文字母(a-z/A-Z)、数字(0-9)、连字符(-),长度大于 0
  3. extension:任意英文字母(a-z/A-Z),长度 2-8
  4. optional-extension:"."开头,后面跟任意英文字母(a-z/A-Z),长度 2-8,可选

每部分的正则表达式为:

  1. yourname:/[a-z\d._-]+/
  2. domain:/[a-z\d-]+/
  3. extension: /[a-z]{2,8}/
  4. optional-extension:/(\.[a-z]{2,8})?/

组合起来造成最后的正则表达式:/^([a-z\d._-]+)@([a-z\d-]+)\.([a-z]{2,8})(\.[a-z]{2,8})?$/;为了增长可读性能够将每部分用"()"包起来,并不要忘记起始和结束符 ^$

结语

今天关于正则表达式的普及就先到这儿,但愿对你们之后写正则能有一点帮助。关于本文中没有涉及到的知识能够参考如下连接:

  1. Wikipedia - Regular Expression
  2. MDN - Regular Expression
  3. Microsoft - Regular Expression Reference
  4. W3schools - Regexp

最后,推荐你们使用Fundebug,一款很好用的 BUG 监控工具~

关于Fundebug

Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有阳光保险、核桃编程、荔枝FM、掌门1对一、微脉、青团社等众多品牌企业。欢迎你们免费试用

img

相关文章
相关标签/搜索