js正则表达式简介

摘要:正则表达式是我们写代码时经常遇到的,它是一种工具,可以帮我们方便简洁地实现搜索和替换功能。下面介绍一下如何构建一个正则表达式。

正则表达式是我们写代码时经常遇到的,它是一种工具,可以帮我们方便简洁地实现搜索和替换功能。下面介绍一下如何构建一个正则表达式。

正则表达式基本组成可以分为字符和元字符。字符通常就是数字和英文字母,元字符是一些表示特别意义的字符,比如"?"这个字符在正则表达式中表示"匹配0次或1次"。我们利用字符和元字符就能组合成各种规则,从而实现各种模式匹配。


1.定义

创建可以用RegEXp()即new RegExp("s"),但更多是通过直接量语法来创建即包含在一对斜杠(/)之间的字符/s/。

正则表达式的模式规则是由一个字符序列组成的,包括所有字母和数字。大多数的字符都是按照直接量仅描述待匹配的字符的。比如/java/可以匹配任何包含“java”字串的字符串。除此外,还有其他具有特殊语义的字符这些字符并不按照字面含义匹配。比如/s$/包含两个字符,第一个“s”按照字面含义匹配,第二个字符$是一个具有特殊语义的元字符,用以匹配字符串的结束。因此这个正则表达式可以匹配任何以“s”结束的字符串。


2.直接量字符

上面说到正则表达式中所有字母和数字都是按照字面含义进行匹配的。如果要匹配非字母的字符,这些字符需要反斜线(\)作为前缀进行转义。

\o    NUL字符(\)

\     制表符(|u0009)

\    换行符(\ )

\v    垂直制表符(\ )

\f    换页符(\ )

\    回车符(\ )

正则表达式中许多标点符号具有特殊含义它们是:^ $ . * + ? = ! : | \/ () [] {}


3.字符类

将直接量字符放进[]内就组成了字符类,一个字符类可以匹配它所包含的任一字符。“^”符号用来表示非。字符类可以使用连字符来表示字符范围,使用/[a-zA-Z0-9]/匹配任何字母和数字。

由于某些字符类非常常用,因此使用了这些字符的转义字符来表示它们。

[...]    方括号内的任意字符

[^...]  除方括号内的任意字符

.        除换行符合其他Unicode行终止符之外的任意字符

\w     任何ASCII字符组成的单词,等价于[a-zA-Z0-9]

\W    任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]

\s      任何Unicode空白符

\S      任何非Unicode空白符的字符

\d      任何ASCII数字等价于[0-9]

\D      除了ASCII数字之外的任何字符,等价于[^0-9]

[\b]    退格直接量(特例)


4.重复

根据正则的语法,可以把两位数描述成/\d\d/,但是还没有一种方法可以用来描述任意多位数字。因此就要用一些特殊字符表示某元素重复出现的次数。

{n,m}  匹配次数大于等于n,小于等于m

{n,}    大于等于n

{n}     等于n

?       匹配0次或者1次,表示可选,等价于{0,1}

+       匹配1次或多次,等价于{1,}

*        匹配0次或多次,等价于{0,}

上面列出的重复匹配字符是尽可能多地匹配,而且允许后续的正则表达式继续匹配。称之为“贪婪的”匹配。

非贪婪匹配只需要在待匹配的字符后跟随一个问号:“?? ”+?“ “*?”或者“{1,5}?”

将“aaa”作为匹配字符串,/a+/会匹配它的三个字符,/a+?/只能匹配第一个

将“aaab”作为匹配字符串,贪婪和非贪婪匹配是一样的。因为正则表达式总是会寻找字符串中第一个可能匹配的字符串。


5.选择、分组和引用

字符“|”表示或。注意:匹配次序是从左至右,如果左边的匹配就忽略右边,即使右边产生更好的匹配项。例如/a|ab/匹配字符串“ab”时就只匹配第一个字符。

“()”有多种作用。

一个作用是把单独的项组合成子表达式,以便可以处理一个独立单元那样用“|”、“*”等对单元内的项进行处理。

另一个作用是允许在同一正则表达式的后部引用前面的子表达式。通过“\”后加一位或多位数字来实现,这个数字指定了带括号的子表达式在正则中从左至右排第几。

还有一个作用是在完整的模式中定义子模式。当一个正则成功和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。例如正在检索的模式是一个或多个小写字母后跟了一位或多位数字,可以使用/[a-z]+\d/,但是如果我们关心的是匹配尾部的数字,就可以这样表示(/[a-z]+(\d+)/)。


6.指定匹配位置

一些元素不匹配某个可见的字符,它们只是指定匹配发生的合法位置。有时我们称这些元素为正则表达式的锚。

^    匹配字符串的开头,在多行检索中,匹配一行的开头

$    匹配字符串的结尾,在多行检索中,匹配一行的结尾

\b   匹配一个单词的边界

\B   匹配非单词边界的位置

(?=p)  零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配P的那些字符

(?!p)   零宽负先行断言,要求接下来的字符不与p匹配

例如要匹配一种常用的程序设计语言的名字,但只有再其后面出现冒号时才匹配,可以使用/[jJ]ava([sS]cript)?(?=\:)/


7.修饰符

修饰符用以说明高级匹配模式的规则。

i    说明模式匹配不区分大小写

g   说明模式匹配应该是全局,也就是被检索字符串中所有的匹配

m  在多行模式中执行匹配

比如正则/java$/im既可以匹配“java”,也可以匹配“Java\ is fun”。


例子

根据上面正则规则,看下面几个正则例子:

一、匹配数字和字符串

  • 整数或者小数:^[0-9]+.{0,1}[0-9]{0,2}$

  • 只能输入数字:"^[0-9]*$"。

  • 只能输入n位的数 字:"^d{n}$"。

  • 只能输入至少n位的数字:"^d{n,}$"。

  • 只能输入m~n位的数字:。"^d{m,n}$"

  • 只 能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

  • 只能输入有两位小数的正实数:"^[0-9]+(.[0-9] {2})?$"。

  • 只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

  • 只能输入非零的正整 数:"^+?[1-9][0-9]*$"。

  • 只能输入非零的负整数:"^-[1-9][]0-9"*$。

  • 只能输入长度为3的字 符:"^.{3}$"。

  • 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。

  • 只能输入由26个大写英文字母组成的字 符串:"^[A-Z]+$"。

  • 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。

  • 只能输入由数字和26个英文字母组 成的字符串:"^[A-Za-z0-9]+$"。

  • 只能输入由数字、26个英文字母或者下划线组成的字符串:"^w+$"。

二、验证用户信息

  • 验证用户 密码:"^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

  • 验证是否含有 ^%&',;=?$"等字符:"[^%&',;=?$x22]+"。

  • 只能输入汉字:"^[u4e00-u9fa5] {0,}$"

  • 验证Email地址:"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"。

  • 验 证InternetURL:"^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$"。

  • 验证电话号 码:"^((d{3,4}-)|d{3.4}-)?d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

  • 验证身份证号 (15位或18位数字):"^d{15}|d{18}$"。

  • 验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式 为:"01"~"09"和"1"~"12"。

  • 验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确 格式为;"01"~"09"和"1"~"31"。

三、匹配中文和其他特殊字符

  • 匹配中文字符的正则表达式: [u4e00-u9fa5]

  • 匹配双字节字符(包括汉字在内):[^x00-xff]

  • 匹配空行的正则表达式: [s| ]*

  • 匹配html标签的正则表达式:<(.*)>(.*)</(.*)>|<(.*)/>

  • 匹配首尾空格的正则表达式:(^s*)|(s*$)


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_11367