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
var str = 'hello , I am weekeight';
var reg1 = /week(eight)/;
var reg2 = /week(?:eight)/;
str.match(reg1); //["weekeight", "eight"]
str.match(reg2); //["weekeight"]
前瞻
正向前瞻 : 接下来出现的应该是某特定字符串集 (?=)
负向前瞻 : 接下来的不应该出现的特定字符串集 (?!)
注: 虽然前瞻需要用到括号(),但是这不是一个分组,不会创建反向引用
var str1 = 'hello, I am weekeight';
var str2 = 'hello,I am weekweek';
var reg1 = /week(?=eight)/
var reg2 = /week(?!eight)/
console.log(reg1.test(str1)); //true
console.log(reg2.test(str1)); //false
console.log(reg2.test(str2)); //true
边界
边界
描述
^
行开头
$
行结尾
\b
单词的边界
\B
非单词的边界
var str = 'hello, I am weekeight';
var reg = /\b(\w+?)\b/g
str.match(reg); //["hello", "I", "am", "weekeight"] 注意匹配结果中`hello`是没有逗号`,`的
正则表达式要点
写在前面
正则表达式相信大家都很熟悉了,但是很多时候需要写或看到一些稍微复杂的正则时就往往感到那都是“似曾相识”。这篇文章没什么干货,但都是正则里的要点,如果你此时此刻感觉正则只是那样的“似曾相识”,那不妨扫两眼来增强你的记忆,唤起正则的小宇宙吧。
基本方法
RegExp对象的方法
index
属性表示匹配文本的第一个字符的位置。input
属性表示被检索的字符串g
时,它会在regSample.lastIndex
属性指定的字符处开始检索字符串,在匹配后,它将把regSample.lastIndex
属性设置为匹配文本的最后一个字符的下一个位置并终止匹配搜索。故可以通过反复调用exec
方法来遍历整个字符串,直到找不到匹配则返回null,并将lastIndex
属性重置为0String字符串的方法
简单模式
元字符
字符类
.
除了换行符和回车之外的任意字符\d
数字\D
非数字字符\s
空白字符\S
非空白字符\w
单词字符 等同于[a-zA-Z_0-9]
\W
非单词字符注:
\b
和\B
不是已定义的字符类,而是字符边界标识量词
简单量词
贪婪、惰性和支配量词
('a "witch" and her "broom" is one').match(/".*"/)
大概的匹配过程如下:"
,在位置3*
是贪婪量词,故会尽量重复匹配元字符.
,一直搜索到字符串结尾处。过程中即使遇到匹配上的也不停止,一定要先搜索到字符串结尾"
broom"
的"
则匹配上了,所以最后结果是"witch" and her "broom"
('a "witch" and her "broom" is one').match(/".*?"/)
大概的匹配过程如下:"
,在位置3*?
是惰性量词,表示0个或多次,那么它会很懒惰地尝试表示0次的时候是否能匹配*?
表示0次时,下一个要匹配的就是正则里最后的那个"
,但是发现字符串第4个位置不匹配,这时候惰性量词*?
再尝试表示1次,一直尝试直到匹配到了"witch"
注: 关于贪婪与惰性的匹配搜索过程建议看这篇文章,非常详细Greedy and Lazy
复杂模式
简单分组(不展开描述)
反向引用
.test()
方法调用时,记录在RegExp.$
中,如\
加上相应数字来表示第几个分组String
对象的replace
方法里使用,通过$
加上对应数字来表示第几个分组候选(
|
不展开描述)非捕获性分组
创建反向引用的分组称为“捕获性分组”,但在复杂的正则表达式中这样会降低匹配效率,当不需要反向引用分组的时候可以考虑使用“非捕获性分组”来降低存储结果的开销,同时也拥有匹配字符串的能力。在分组的左括号后面加上
?:
则表达这个分组是“非捕获性”的,不会创建反向引用。在
String
对象的match
方法使用,捕获性分组会把信息存到返回的结果数组中,而非捕获性分组则不会前瞻
(?=)
(?!)
注: 虽然前瞻需要用到括号
()
,但是这不是一个分组,不会创建反向引用边界
最后
最后,在我们查看别人写的或者自己以前写的比较复杂的正则表达式的时候少不了用一些可视化工具来分析理解,Regulex 就是一个很不错的可视化工具。
The text was updated successfully, but these errors were encountered: