摘要:正则表达式语法正则表达式是由普通字符例如数字字母标点和用来表示特定字符或字符集的元字符以及特殊字符用作限定条件或特殊功能的字符组成的文字模式。正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
正则表达式语法
正则表达式是由普通字符(例如数字、字母、标点和用来表示特定字符或字符集的元字符)以及特殊字符(用作限定条件或特殊功能的字符)组成的文字模式。
普通字符所有数字、小写字母、大写字母、标点都属于普通字符。
而为了匹配除以上列出的字符集以外的字符,或者匹配特定范围内的任意字符,需要使用元字符。元字符分直接量字符和字符类。
直接量字符字符 | 描述 |
---|---|
uXXXX | 由16进制数XXXX指定的unicode字符 |
xNN | 由16进制数NN指定的拉丁字符 |
o | NUL字符(u0000) |
t | 制表符(u0009) |
n | 换行符(u000A) |
v | 垂直制表符(u000B) |
f | 换页符(u000C) |
r | 回车符(u000D) |
字符类元字符用来匹配特定范围内的字符。一个字符类可以匹配它所包含的任意字符。
字符 | 描述 |
---|---|
. | 除了换行和行结束符之外的所有单个字符 |
w | 等价于[0-9a-zA-Z] |
W | 除了w以外的所有字符 |
s | 任何Unicode空白符 |
S | 任何非Unicode空白符的字符(范围比w大) |
d | 等价于[0-9] |
D | 除了d以外的所有字符 |
[...] | 方括号内的任意字符 |
1 | 除了方括号内字符集的任意字符 |
当需要匹配多个指定的字符时,需要用到一些专门的特殊字符来表示重复匹配的次数。
字符 | 描述 |
---|---|
{n,m} | 匹配至少n次,但不能超过m次 |
{n,} | 匹配至少n次,无上限 |
{n} | 匹配n次 |
? | 匹配0次或1次,等价于{0,1} |
+ | 匹配1次或多次,无上限,等价于{1,} |
* | 匹配0次或多次,无上限,等价于{0,} |
重复字符需要与普通字符配合使用,如[a-z]{3,5},即匹配3个到5个小写字母。
锚字符当需要匹配以指定字符开头或结尾的字符串时,需要用到锚字符。
字符 | 描述 |
---|---|
^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
(?=p) | 零宽正向先行断言,要求接下来的字符都与p匹配,匹配结果不包含p |
(?!p) | 零宽负向先行断言,要求接下来的字符不能和p匹配 |
b | 匹配一个字边界(需要和其他表达式配合使用,多带带使用[b]表示退格符) |
B | 匹配一个非字边界 |
例:需要匹配以字母、下划线或$开头的字符串来校验变量名是否合法,可以使用/^[a-zA-Z_$].*/
注:^在方括号[]内部表示反向匹配。
零宽先行断言可以将任何正则表达式都做为结尾锚点,q(?=p)表示匹配所有以p结尾的q字符串,匹配结果仅包含q部分,不包含锚点p。
例:匹配以”.”结尾的字符串,可以使用/w+(?=.)/g
则匹配"a.b.c.d.e.f"的结果为["a","b","c","d","e"]。f后没有.,所以不被匹配。
q(?!p)表示匹配所有不以p结尾的q字符串。
注:javascript不支持后行断言,即不能将正则表达式作为开始锚点。
b可以用来匹配一个单词的开头或结尾。例:匹配String中的Str用/bStr/,匹配String中的ing用/ingb/
B可用来匹配一个单词的中间部分。例:匹配String中的trin用/BtrinB/
选择、分组和引用字符字符 | 描述 |
---|---|
| | 选择匹配,“|”左边的表达式和右边的表达式皆可匹配 |
(...) | 分组匹配,将几个项组合为一个单元,这个单元可以用"*","+","?","|","{n,m}"等符号加以修饰。而且可以记住和这个组合相匹配的字符。 |
(?:...) | 非捕获性分组,只负责匹配,不记忆与该组相匹配的字符 |
(?:...)和(...)的差异仅仅存在与匹配结果,当需要记录某一部分匹配项时,用(...)。若只是用来匹配,后续不需要使用分组匹配到的字符串,则用(?:...)
转义字符字符 | 描述 |
---|---|
RegExp实例化有两张方式。一种通过字面量实例化,一种通过new RegExp()构造函数实例化
var exp = / pattern / flags; //RegExp字面量 var exp = new RegExp("pattern","flags"); //RegExp构造函数
flags用来表示正则表达式的行为。可选项有g,i,m三个标识,可同时定义一个或多个标识。
g:global,表示全局模式。flags中包含g时,表达式匹配所有能够匹配上的字符串;如果没包含g时,则当匹配到第一个字符串时,即停止匹配。
i:case-insentive,表示忽略大小写。flags中包含i时,表达式匹配时忽略字符串的大小写。
m:multi-line,表示多行匹配。flags中包含m时,表达式匹配到一行文本末尾时还会继续查找下一行中是否存在匹配项。
pattern即正则表达式语句。
RegExp构造函数优势在于可以动态传入正则表达式。
RegExp实例属性 globalboolean值,表示是否设置了g标志。
ignoreCaseboolean值,表示是否设置了i标志。
multilineboolean值,表示是否设置了m标志。
source正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
lastIndex整数,表示开始搜索下一个匹配项的字符位置,从0 算起。
例:
var exp = /[bc]at/gi; exp.global;//true exp.ignoreCase;//true exp.multiline;//false exp.source;//“[bc]at”RegExp实例方法 exec()
exec方法接受一个参数,即需要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者在没有匹配项时返回null。返回的数组是Array实例,但还包含额外两个属性:index和input。
一句句解释。
返回包含第一个匹配项信息的数组,或者在没有匹配项时返回null:
这里分两种情况,一种是global匹配,一种是非global匹配。
global模式执行exec()匹配成功一次以后,再次执行exec()时,会从前一次匹配的最后一位开始继续向后匹配。例:
var exp = /.at/g var matches = exp.exec("cat, bat, sat, fat"); //第一次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 3 matches = exp.exec("cat, bat, sat, fat"); //第二次匹配 matches.index => 5 matches.input => "cat, bat, sat, fat" matches => ["bat"] exp.lastIndex => 8 ...
非global模式执行exec()匹配成功一次以后,再次执行exec()时,会从头开始重新匹配。
var exp = /.at/ var matches = exp.exec("cat, bat, sat, fat"); //第一次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 0 matches = exp.exec("cat, bat, sat, fat"); //第二次匹配 matches.index => 0 matches.input => "cat, bat, sat, fat" matches => ["cat"] exp.lastIndex => 0
返回的数组是Array实例:
当使用(...)分组匹配时,一次exec()会匹配到多个结果
var exp = /(there)s+(you)s+(are)/; var matches = exp.exec("hey, there you are my dear"); matches = ["there you are", "there", "you", "are"];
matches[0]匹配整个表达式字符串。
matches[1]匹配第一个(...)内的字符串,之后以此类推。
补充说明:含(?:...)非捕获分组的表达式执行exec后返回的数组中不包含(?:...)匹配的字符串。非捕获性分组(?:...)和捕获性分组(...)的区别就在这里。
属性index和input:
index表示匹配项在字符串中的起始位置。
input表示应用正则表达式的字符串。
test方法接受一个参数作为需要应用模式的字符串,在模式与该参数匹配的情况下返回true,否则返回false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法非常方便。因此,test()方法经常被用在if 语句中。
用于模式匹配的string方法string有四个方法可以将正则表达式作为参数传入。
search()str.search(exp)返回str中第一个与exp表达式匹配的字符串的起始位置。如果找不到匹配项,返回-1。如果search传入的参数是一个string,则首先会通过RegExp构造函数将其转换为正则表达式。search不支持全局搜索,它会忽略global标识。
"JavaScript".search(/script/i) => 4replace()
str.replace(exp, replaceStr)第一个参数是一个正则表达式,第二个参数是要替换成的字符串。如果exp带有global标识,那么源字符str中所有与exp表达式匹配的子串都会被替换。如果不带g,str中仅第一个与exp匹配的子串会被替换。
text.replace(/javascript/gi, "JS") //将text全文中所有javascript改为JS
replaceStr中如果出现$加数字N的字符串,表示第N个子表达式相匹配的文本。
text.replace(/"([^"]*)"/g, ""$1"") //将text全文中所有被""引用的子串替换成被""引用。match()
str.match(exp)返回一个由匹配结果组成的数组。
该数组不同于RegExp实例方法exex()返回的数组。当有global标识时,match返回全局匹配到的所有字符串组成的数组;当没有global标识时,match就返回第一个匹配到的字符串组成的单元素数组。
"11+2=13".match(/d/g) => ["1","1","2","1","3"] "11+2=13".match(/d/) => ["1"]
match方法不会返回捕获性组合匹配到的子串,(...)分组匹配在match方法中不会像RegExp实例方法exec()一样返回匹配的子串。
split()当split方法传入的参数为正则表达式时,这使得split()方法异常强大。例如,可以指定分隔符,允许两边可以留有任意多的空白符:
"1 , ,2 , 3 , 4 , 5".split(/s*,s*/) => ["1","2","3","4","5"]
... ↩
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80112.html
摘要:控制权和传动这两个词可能在搜一些博文或者资料的时候会遇到,这里做一个解释先控制权是指哪一个正则子表达式可能为一个普通字符元字符或元字符序列组成在匹配字符串,那么控制权就在哪。 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路;正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,...
摘要:它的语法是被匹配字符串一个正则组成的数组,比如,,该方法返回与匹配链条正则数组最后一个正则的匹配内容,或一个空数组。 好像网上介绍JS正则库的文章不多,可能也是因为复杂的正则匹配很少需要在客户端运行,所以JS上用的不多,并且我搜JS的正则库还真没找到第二个,囧。但它的一些特性挺实用,有兴趣的同学可以看看。由于没花太多时间去琢磨,所以本文只将该库作简要介绍,本文用例全部来自它的API文档...
摘要:写在前面正在看的源码看到了部分感觉以前看的正则表达式基础知识已经完全不够用了现翻阅博客资料将一些中正则表达式难用的部分总结归纳方便自己和友翻阅正则分组重复匹配对于重复的匹配我们经常使用到正则表达式的分组功能我们使用正则匹配地址来实践一下假 [TOC] 写在前面 - Lionad 正在看VueJS的源码, 看到了HtmlParser部分, 感觉以前看的正则表达式基础知识已经完全不够用了,...
摘要:非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 导读 你有没有在搜索文本的时候绞尽脑汁, 试了一个又一个表达式, 还是不行. 你有没有在表单验证的时候, 只是做做样子(只要不为空就好), 然后烧香拜佛, 虔诚祈祷, 千万不要出错. 你有没有在使用sed 和 grep 命令的时候, 感觉莫名其妙, 明明应该支持的元字符, 却就是匹配不到. 甚至,...
摘要:玩转对象中的正则表达式的正则表达式语法极大地借鉴了另一种脚本语言的正则表达式语法对象是的一个内置对象,与,类似。创建对象可通过构造函数创建。当要根据用户输入来构造正则表达式时,必须采用构造函数方式。如与被看做相同的字符模式。 玩转javascript RegExp对象 js中的正则表达式 js的正则表达式语法极大地借鉴了另一种脚本语言Perl的正则表达式语法.RegExp对象是js的一...
阅读 1418·2021-09-22 15:52
阅读 1458·2019-08-30 15:44
阅读 895·2019-08-30 14:24
阅读 2705·2019-08-30 13:06
阅读 2700·2019-08-26 13:45
阅读 2782·2019-08-26 13:43
阅读 1014·2019-08-26 12:01
阅读 1435·2019-08-26 11:56