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

 更新时间:2019年06月19日 10:55:19   作者:Fundebug   我要评论

大家都很多时候都会觉得正则表达式难记、难学、难用,但不可否认的是正则表达式是一项很重要的技能,所有我将学习和使用正则表达式时的关键点整理如下,供大家参考

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

不同语言中的正则表达式写法有少许差异,本文将使用 Javascript 中的语法。

什么是正则表达式?

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

调试工具

下面列出了几款优秀的在线调试工具,如果你想创建或者调试正则表达式可能会需要。个人比较偏好Regex101,regex101 支持在正则表达式的不同 flavor 之间切换、解释你的正则表达式、显示匹配信息、提供常用语法参考等功能,非常?#30475;蟆?/p>

Regex101

Regexr

Regexpal

开始

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

Flags(标志符或修饰符)

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

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

Flags 可以组合使用,如:

Character Sets(字符集合)

用于匹配字符集合中的?#25105;?#19968;个字符,常见的字符集有:

[xyz]:匹配 "x""y"``"z"[^xyz]:补集,匹配除 "x" "y" "z"的其他字符[a-z]:匹配从 "a""z" 的?#25105;?#23383;符[^a-n]:补集,匹配除 "a""n" 的其他字符[A-Z]:匹配从 "A""Z" 的?#25105;?#23383;符[0-9]:匹配从 "0""9" 的?#25105;?#25968;字

比如匹配所有的字母和数字可以写成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i

Quantifiers (?#30475;?

在?#23548;?#20351;用中,我们常常需要匹配同一类型的字符多次,比如匹配 11 位的手机号,我们不可能将 [0-9] 写 11 遍,此时我们可以使用 Quantifiers ?#35789;?#29616;重复匹配。

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

Metacharacters(元字符)

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

常见的元字符有:

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

Special Characters (特殊字符)

正则中存在一些特殊字符,它们不会按照字面意思进行匹配,而有特殊的意义,比如前文?#34917;?#29992;于?#30475;?#30340;?*+。其他常见的特殊字符有:

\:转义字符,可以将普通字符转成特殊字符。比如 \w;也可以将特殊字符转成字面意思,比如 \+ 匹配 "+".:匹配?#25105;?#21333;个字符,但是换行符除外:\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)/ 匹配?#20063;?#33719; "foo bar." 中的 "foo"。被匹配的子字符串可以在结果数组的元素 [1], ..., [n] 中找到,或在被定义的 RegExp 对象的属性 $1, ..., $9 中找到(?:xyz):非捕获分组(Non-capturing Group),匹配但不会捕获匹配项;匹配项不能再次被访问到\nn 是一个正整数,表示反向引用(back reference),?#36214;?#27491;则表达式中第 n 个括号(从左开始数)中匹配的子字符串;例如,/apple(,)\sorange\1/ 匹配 "apple, orange, cherry, peach." 中的 "apple,orange,"

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

/\d+(?!\.)/.exec('3.141')` 匹配 `"141"`,而不是 `"3.141"

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

应用

上面罗列出了这么多正则表达式的语法和规则,可以在一定程度?#20064;?#21161;我们分析和理解一段正则表达式的作用,但是如何将这些规则组合并创造出有特定作用的表达式还需要我们自己多加练习,下面举几个例子?#27492;得?#36816;用这些规则。

1. 匹配手机号码

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

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

组合起来即为 /^1[34578]\d{9}$//^1(3|4|5|7|8)\d{9}$/,因为使用捕获括号存在性能损失,所以推荐使用第一?#20013;?#27861;。

2. 匹配电子邮件

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

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

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

每部分的正则表达式为:

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})?$/;为了增加可?#21015;?#21487;以将每部分用"()"包起来,并不要忘记起始和结束符 ^$

结语

今天关于正则表达式的普及就先到这儿,希望对大家以后写正则能有一点帮助。关于本文中没有涉及到的知识可以参?#23478;?#19979;链接:

Wikipedia - Regular ExpressionMDN - Regular ExpressionMicrosoft - Regular Expression ReferenceW3schools - Regexp

好了,本文就给大家介绍到这里,希望对大家有所帮助!

  • 正则用(?&gt;…)实现固化分组提高效率

    正则用(?&gt;…)实现固化分组提高效率

    用(?>…)实现固化分组(成功匹配后,回簌时不会考虑这个匹配的字符)
    2012-10-10
  • 正则表达式之全部符号对照表

    正则表达式之全部符号对照表

    下面一骗整理的比较详细的函数对照表,放到大家在书写正则的时候参考下
    2008-09-09
  • 正则表达式实现字符的模糊匹配功能示例

    正则表达式实现字符的模糊匹配功能示例

    这篇文章主要介绍了正则表达式实现字符的模糊匹配功能,结合具体java实例形式分析了针对字符串的模糊匹配查询相关实现?#35760;?需要的朋友可以参考下
    2017-05-05
  • 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等

    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需

    很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求。所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下。给自己留个底,也给朋友们做个参考。
    2015-09-09
  • JS的正则表达式常用检测代码

    JS的正则表达式常用检测代码

    JS的正则表达式常用检测代码,需要做表单检测的朋友可以参考下。利用正则的检测代码,更强,代码更少。
    2011-01-01
  • 正则匹配后面非指定字符的正则

    正则匹配后面非指定字符的正则

    正则匹配后面非指定字符的正则...
    2006-11-11
  • 20个正则表达式必知(能让你少写1,000?#20889;?#30721;)

    20个正则表达式必知(能让你少写1,000?#20889;?#30721;)

    这篇文章主要介绍了20个正则表达式必知(能让你少写1,000?#20889;?#30721;)的相关资料,需要的朋友可以参考下
    2016-04-04
  • 如何快速学习正则表达式

    如何快速学习正则表达式

    在日常工作中,我们经常写正则表达式,比如在表单中经常用来验证用户输入的格式是否正确。接下来通过本文给大家介绍如何快速学习正则表达式,?#34892;?#36259;的小伙伴一起学习吧
    2016-05-05
  • JavaScript正则方法replace实现搜索关键字高亮显示

    JavaScript正则方法replace实现搜索关键字高亮显示

    这里介绍的是JavaScript的正则表达式的replace方法 ,和实现搜索关键字高亮的功能.先介绍一下正则表达式的replace方法,具体内容详情大家参考下本文
    2017-09-09
  • 最新评论

    常用在线小工具

    时时彩包赢公式0369
    澳门五分彩合法吗 排列三走势图200期 福彩查询 超级大乐透开奖时间 竞彩足彩胜平负 真人龙虎斗有什么技巧 江西时时彩3星和值 青海11选5基本跨度 吉林11选5任2技巧 双色球杀号 福建36选7浙江风采网走势图 齐鲁风采30选5 足彩14场胜负投注技巧 北京快三开奖助手免费 福彩华东15选5开奖结果