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
// global
let ret = '123haha'.match(/haha/);
// => ['haha']
// not in global
'123haha'.match(/haha/)
// => ["haha", index: 3, input: "123haha", groups: undefined]
前言
js正则表达式, 平时用的倒是挺多, 但是就是缺少系统的学习, 感觉没有一次可以脱离文档的. 当看到一些源码里面一些前瞻,后顾的运用的时候,常常觉得梦里似曾相识, 对面相逢却不认得.
正文
我常会把search, match, 混淆到正则对象的方法里面, 和exec, test相提并论,
造成这种的尴尬的原因也很简单, 就是里面包含了正则表达式.
但是search, match的理解和记忆本来就和String字符串挂钩, 搜索字符, 和匹配子字符串.
String.search() 直接返回子串匹配的索引
全局匹配和非全局并没有什么不同
String.match() 返回null, 或者匹配的结果数组
需要注意的是, match的参数的一定是正则, 没有字符串类型的参数, 不像search, replace, split等等.
返回的直接就是匹配的数组或者null.
分2种情况.
g
,代表全局匹配, 那么返回就是一个null, 或者数组, 数组中的元素是每个匹配成功的子字符串, 如上.g
,代表全局匹配, 返回也是一个null, 或者数组, 但是数组的元素是匹配的字符串和子分组的字符串的组合. 这个数组还有一个属性, index,表示匹配的下标, input, 表示原字符串, 另外还有一个不支持的groups, 表示具名分组的内容. 具名分组在V8里面早已经实现了regexp-named-groups至于上面有2个
haha
, 则是因为第二个是分组的子串.具名分组的方式, 也是用来反向引用,
/(?<haha>haha)\k<haha>/
,和String相关的正则方法一些字符串还有replace,split
String.replace() 返回替换后的字符串
replace的参数有2个, 第一个是匹配替换的字符串/正则, 第二个是替换匹配的字符串/函数
主要是第二个参数, 在函数的情况下, 参数的个数是不定.
和match的非全局匹配的情况是是一致的, 只是数据格式会不一样, 这里的匹配的索引, 和原匹配的字符串, 都是放到了数组里面吗, 如果有具名匹配的话, 还会把具名匹配的对象放到最后一个参数后,
RegExp.exec() 检索字符串的匹配
exec和match一样, 也是区分全局匹配, 和非全局匹配的.
g
, 全局匹配下, 那么会修改lastIndex的值, 作为改正则下一次进行exec()调用的起始下标.全局匹配的情况下,lastIndex记录下一次开始匹配的下标, 依次返回数组, 匹配为空则为null, lastIndex为0, 证明完成匹配.
g
, 非全局匹配下, 进行的匹配和match非全局匹配是一致的, 返回的是一个由匹配字符串, 分组字符串, 匹配的下标, 原匹配字符串, 具名分组信息, 组成的数组;是否可以通过lastIndex, 编辑匹配的起始位置?
结论: test, exec 可以通过编辑RegExp.lastIndex, 来定义其实的匹配开始位置, 而这个对String的方法来说不起作用.
正则的相关规则
说道这里, 正则的相关内容很多,
()
, 配套记忆[]
配合使用good boy
, 这个间隙不是单词间空格,-good- -boy-
,-
就是\b
0-9a-zA-Z_
0-9a-zA-Z_
以外的字符0-9
0-9
以外的字符tab
\v
后面的字符从下一行开始输出,且开始的列数为“\v”前一个字符所在列后面一列/apple(,)\sorange\1/
匹配apple, orange, cherry, peach.
中的apple, orange,
举个例子
金额3位一组, 添加,显示
'12345678'.replace(/\B(?=(\d{3})+$)/g,',');
// => 12,345,678
电子邮箱
/^\w+@\w+.([a-z]+)$/g.test(
1111@qq.com
);结尾
匹配串
,分组子串
,下标
,原字符串
,具名分组
replace, split, search, match
The text was updated successfully, but these errors were encountered: