正则表达式是很多程序员的弱项技能,甚至是一些有多年经验的开发人员。大家经常会觉得正则表达式难记、难学、难用,但不可否认的是正则表达式是一项非常重要的技能,所以我将学习和使用正则表达式时的要点整理如下,供大家参考。
不同语言中正则表达式的书写存在一些差异。本文将使用Javascript中的语法。
什么是正则表达式?
正则表达式(正则表达式或Regex)是用于定义特定搜索模式的字符组合。正则表达式可用于匹配、查找和替换文本中的字符、验证输入数据以及查找英语单词的拼写错误。
调试工具
如果您想要创建或调试正则表达式,这里有一些很好的在线调试工具。我更喜欢Regex101。regex101支持在不同风格的正则表达式之间切换,解释您的正则表达式,显示匹配信息,提供通用语法引用等等。它非常强大。
Regex101
Regexr
Regexpal
开始
在Javascript中,正则表达式以/开头和结尾,所以简单如/hello regexp/就是正则表达式。
标志(标志或修饰符)
/结束后写入的标志会影响整个正则表达式的匹配行为。常见标志有:
g:全球);匹配;默认情况下,正则表达式只会返回第一个匹配结果,所有匹配的I都可以使用标识符G返回:不区分大小写;匹配m: multiline时忽略英文字母的大小写;将开始和结束字符(和$)视为在多行上工作,即匹配每行的开始和结束(除以n或r),而不仅仅是整个输入字符串的开始和结束。
标志可以组合使用,例如:
字符集(字符集)
用于匹配字符集中的任何字符。常见的字符集有:
[xyz]:匹配“x”或“y”` ` z '[XYZ]:补码,匹配除“x”“y”“z”[a-z]以外的其他字符:匹配从“a”到“z”[a-n]的任何字符:补码,
例如,匹配所有字母和数字可以写成:/[a-zA-Z0-9]/或/[a-z0-9]/i。
量词(量词)
在实践中,我们经常需要多次匹配同类型的字符,比如匹配11位的手机号码。我们不能写[0-9] 11次。此时,我们可以使用量词来实现重复匹配。
{n}:匹配n次{n,m}:匹配n-m次{n,m }:匹配=n次?match 0 || 1次*: match=0次,相当于{0,}: match=1次,相当于{1,}
元字符(元字符)
正则表达式中有一些具有特殊含义的字母,称为元字符。简而言之,元字符是描述字符的字符,用于描述字符表达式的内容、转换和各种操作信息。
常见的元字符有:
d:匹配任意数字,相当于[0-9]D:匹配任意非数字字符;d w补码:匹配任何基本拉丁字母中的字母和数字,以及下划线;相当于[A-Za-z0-9_]W:匹配任意非基本拉丁字母中的字母和数字,以及下划线;w s的补码:匹配空格,包括空格、制表符、分页符、换行符和其他Unicode空格s:匹配非空格;s b的补码:匹配零宽度的单词边界,例如字母和空格之间;例如,/ b否/匹配“中午”中的“否”,/lyb/匹配“昨天”中的“可能”。 b:匹配零宽度非单词边界,例如两个字母或两个空格之间;例如,/Bon/matches' on' in '中午',/yeB/matches' ye' in '可能是昨天' t:匹配水平制表符 n:匹配换行符 r:匹配回车符(回车符)
特殊字符(特殊字符)
正则化中有一些特殊的字符,字面上不匹配,但有特殊的含义,比如上面提到的量词?*、其他常见的特殊字符有:
:转义字符,可将普通字符转换为特殊字符。例如 w;您也可以将特殊字符翻译成字面意思,例如 match ' '。匹配除换行符以外的任何单个字符:n,r,u2028或 u2029在字符集([。]),没有特别的意思,就是字面意思的“.”|:替换字符,匹配|之前或之后的表达式。例如,如果需要同时匹配“熊”和“梨”,可以使用/(b|p)ear/或/bear | pear/;但是不能用/b|pear/。表达式只能匹配“b”和“pear”:匹配输入的开头。例如,/A/与“一个苹果”中的“A”不匹配,但与“一个苹果”中的“A”$匹配:与输入的结尾匹配。例如,/t$/与“eater”中的“t”不匹配,但与“eat”中的“t”匹配。和$经常用于表单验证,因为需要从头到尾验证一个完整的输入,而不是匹配输入中的某个段落
组(xyz):捕获组,匹配,捕获匹配项;例如,/(foo)/匹配并捕获“foo”栏中的“foo”。匹配的子串可以在元素[1]中找到,或者在属性$1中,定义的RegExp对象的$9(?xyz):非抓取组,匹配但不抓取匹配项;无法再次访问匹配项n:n: n是正整数,表示反向引用,指向正则表达式中第n个括号(从左边开始计数)中的匹配子字符串;例如,/apple(,sorange1/匹配“苹果、橙子、樱桃、桃子”中的“苹果、橙子”。'
断言x(?=y):只匹配x后跟y;例如,/bruce(?=wayne)/,如果‘Bruce’后面跟着wayne,匹配它。/bruce(?=wayne|banner)/,如果“bruce”后面跟着“wayne”或banner,则匹配它。但是,无论是‘Wayne’还是‘banner’都不会出现x(?y):只匹配不跟y的x;例如,/d(?.)/只匹配不带“.”的数字。
/d(?.)/.exec('3.141 ')匹配“141”而不是“3.141”。最后推荐大家使用FundeBUG,一个不错的BUG监控工具~
app应用
上面列举的这么多正则表达式的语法和规则,可以在一定程度上帮助我们分析和理解一个正则表达式的功能,但是如何将这些规则结合起来,创建出具有特定功能的表达式,还需要更多的实践。这里有一些例子来说明这些规则的应用。
1.匹配手机号码
让我们从简单匹配手机号码开始。目前国内手机号码都是1(3/4/5/7/8)开头的11位数字,所以手机号码的正规化可以分解为以下几个部分:
以1开头:/1/第二位数字是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} $/。因为使用捕获括号时会有性能损失,所以建议使用第一种写入方法。
2.匹配电子邮件
电子邮件由您的姓名@ domain.extension可选-extension组成。
各部分的格式标准为(相应简化,主要是说明如何写规律性):
你的名字:任何英文字母(a-z/A-Z)、数字(0-9)、下划线(_)、英文句号(。),连字符(-),长度大于0域:任何英文字母(a-z/A-Z),数字(0-9),连字符()
每个部分的正则表达式是:
your name:/[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})?$/;为了提高可读性,您可以用' ()'包装每个部分,并且不要忘记开始和结束字符$。
结论
今天正则表达式的普及就先说到这里,希望对大家以后写正则表达式有所帮助。有关本文未涉及的知识,请参考以下链接:
维基百科-正则表达式DN -正则表达式Microsoft -正则表达式引用W3schools - Regexp
好了,这篇文章就介绍给大家了,希望对大家有所帮助!