You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vartestString="cat and dog and bird";varpattern=/dog(andbird)?/g;varpatternNo=/ball(andfoot)?/g;varresult=pattern.exec(testString);console.info(result);// ["dog and bird", "and bird", index: 8, input: "cat and dog and bird",groups: undefined]varresultNo=patternNo.exec(testString);console.info(resultNo);// null
test()
功能:用于检测一个字符串是否匹配某个模式。
参数:必需,接受一个字符串。
结果:能匹配到时,返回 true,否则,返回 false。
vartestString="cat and dog and bird";varpattern=/dog/g;varpatternNo=/ball/g;varresult=pattern.test(testString);console.info(result);// truevarresultNo=patternNo.test(testString);console.info(resultNo);// false
vartestString="cat and dog and bird";varpattern=/and/g;varpatternNo=/ball/g;varresult=testString.search(pattern);console.info(result);// 4varresultNo=testString.search(patternNo);console.info(resultNo);// -1
match()
功能:该方法可在字符串内检索指定的值,找到一个或多个正则表达式的匹配。
参数:必需,接受一个参数,为正则表达式或 RegExp 对象。
结果:返回一个数组。没有匹配到则返回 null。
vartestString="cat and dog and bird";varpattern=/and/g;varpatternNo=/ball/g;varresult=testString.match(pattern);console.info(result);// ["and","and"]varresultNo=testString.match(patternNo);console.info(resultNo);// null
vartestString="cat and dog and bird";varpattern=/and/g;varresult=testString.replace(pattern,function(){return'or';});console.info(result);// cat or dog or birdvarresultEmpty=testString.replace('',function(){return'or';});console.info(resultEmpty);// orcat and dog and bird
目录
想法
想起之前的工作,碰到需要用正则表达式的时候,就到网上找相关的资料,但总觉得不太符合自己想要的东西。索性根据自身的需求,整理出自己可以随时使用和补充更新的文档。
简介
正则表达式是一连串字符定义的搜索模式。通常这个模式被字符串搜索算法,用于在字符串中进行”查找“和”查看并替换“操作,也用于输入验证。它是从 TCS 和 formal language 理论中发展出来。
这个概念产生于 20 世纪 50 年代,当时美国数学家 Stephen Cole Kleene 将一种常规语言的描述形式化。这个概念的广泛使用是在 Unix 文本处理程序中。自 20 世纪 80 年代以来,编写正则表达式存在不同的语法,一种是 POSIX 标准,另一种广泛使用的是 Perl 语法。许多编程语言通过内置或类库的方式,来提供正则表达功能。
以下是 JavaScript 中的正则表达式的使用,有些正则特性 JavaScript 并不支持,具体见这里。
一个简单的示例
在下面的字符串中匹配出单词“love”:
这个例子里面的中
/love/g
的含义是匹配所有由 l、o、v、e 4 个字符组成的字符串。这其中正则相关知识点有:/love/g
:正则表达式的创建。match()
:能使用正则表达式的方法。下面由此为切入点开始进行相关的介绍。
创建
创建正则表达式的语法,又两种形式如下:
pattern
模式中可以包含多种类型,下面就先介绍几个常用的类型:普通字符、特殊字符、方括号、限定符、定位符。
普通字符
在上面的例子中就是属于这种类型,还包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
元字符是拥有特殊含义的字符:
特殊字符
特殊字符是一些拥有特殊含义的字符,例如
/lo*e/
中的*
表示任何字符,但如果想要查找字符串中的*
,则需要对*
进行转义,方式是在前面加反斜杠字符\
,就变成了/lo\*e/
。这类特殊字符还有:如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
要匹配 $ 字符本身,请使用
\$
。要匹配这些字符,请使用
\(
和\)
。\*
。\
。\.
。\[
。\?
。例如, 'n' 匹配字符 'n'。
\n
匹配换行符。序列\\
匹配\
,而\(
则匹配 "("。要匹配 ^ 字符本身,请使用
\^
。\{
。\|
。方括号
方括号用于查找某个范围内的字符。例如下面的例子:
限定符
限定符用来指定正则表达式中的一部分,必须要出现多少次才能满足匹配。有下面几种:
定位符
定位符用来描述字符串或单词的边界,能够将正则表达式固定到行首或行尾。
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面,不能有一个以上位置,因此不允许诸如
^*
之类的表达式。flags
修饰符用于执行区分大小写和全局匹配:
从上面含义可以知道,如果不设置修饰符,正则表达式匹配的时候遵循的规是:区分大小写、只找到匹配的第一个、不执行多行匹配。
方法
RegExp 对象方法
主要有:
exec()
、test()
、toString()
。exec()
返回的数组,较一般的数组数组多了两个额外的属性:index、input。
test()
toString() 和 toLocaleString()
返回真正表达式的字面量。
支持正则表达式的 String 对象的方法
主要有:
search()
、match()
、replace()
、split()
。search()
这个方法始终从字符串开头向后查找。
match()
replace()
split()
RegExp 实例属性
每个实例都又如下的属性:
如何写一个正则
最近跟人交流的时候,意识到一个问题:虽然收集了资料,知道有这些,看教程好像是这么回事,但要临时写一个的话,不知道如何下手。
自己想到的解决方法:先分析常见的正则表达式,从中发现适合自己理解的方法,并进行总结。
来看看去空的正则。
去空正则分析
观察正则并进行拆分:
/ /
,是创建正则的形式。\s
,是表示空字符串的元字符,属于普通字符。g
,是修饰符,表示执行全局匹配。思考
上面是基于写好的正则进行拆分,发现功能语义跟正则的表达式是一一对应。其实一开始就是这样的,之所以自己碰到正则就感觉头蒙,是因为自己想一步到位,但自己基本都没有掌握很熟练,当然就会不知如何下手。由此,个人想到写正则的思路是:
熟悉基本正则模式,不需要全部记住,知道大概几类就可以,使用的时候可以再查,逐渐强化记忆。
举个例子:匹配手机号。
第 1 步
“匹配手机号”这个描述还要细化,手机号都是数字,共 11 位,国内号码段有:13、14、15、16、17、18、19。
提取关键点:
第 2 步
\d
,表示数字范围的方括号[0-9]
,全局匹配g
。{}
。^
,匹配多个选项中的一个|
。第 3 步
根据以上信息尝试写出的正则:
经过尝试,发现超过 11 位的数字也符合匹配。原因是没有匹配结尾的位置。修正后正则为:
正则收集
校验数字
校验字符
其它
参考资料
The text was updated successfully, but these errors were encountered: