定义
Regular expressions are patterns used to match character combinations in strings.
知识点 字符匹配
1 2 3 4 var regex = /ab{2,5}c/g ;var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc" ;console .log( string.match(regex) );
1 2 3 4 var regex = /a[123]b/g ;var string = "a0b a1b a2b a3b a4b" ;console .log( string.match(regex) );
1 2 3 4 5 6 7 8 9 var regex = /good|nice/g ;var string = "good idea, nice try." ;console .log( string.match(regex) );var regex = /good|goodbye/g ;var string = "goodbye" ;console .log( string.match(regex) );
位置匹配 ^
$
1 2 3 4 5 6 7 ^(脱字符)匹配开头,在多行匹配中匹配行开头。 $(美元符号)匹配结尾,在多行匹配中匹配行结尾。 var result = "hello" .replace(/^|$/g , '#' );console .log(result);
\b
1 2 3 4 5 var result = "[JS] Lesson_01.mp4" .replace(/\b/g , '#' );console .log(result);
\B
1 2 3 4 5 6 var result = "[JS] Lesson_01.mp4" .replace(/\B/g , '#' );console .log(result);
(?=)
1 2 3 4 5 6 var result = "hello" .replace(/(?=l)/g , '#' );console .log(result);
(?!)
1 2 3 4 5 var result = "hello" .replace(/(?!l)/g , '#' );console .log(result);
括号作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 "这是括号一个重要的作用,有了它,我们就可以进行数据提取,以及更强大的替换操作。" var regex = /(ab)+/g ;var string = "ababa abbb ababab" ;console .log( string.match(regex) );var regex = /(\d{4})-(\d{2})-(\d{2})/ ;var string = "2017-06-12" ;console .log( string.match(regex) );var string = "2017.06.27" ;var regex1 = /\b(\d+)\b/ ;var regex2 = /\b(\d+)\b/g ;console .log( string.match(regex1) );console .log( string.match(regex2) );var regex = /(\d{4})-(\d{2})-(\d{2})/ ;var string = "2017-06-12" ;var result = string.replace(regex, "$2/$3/$1" );console .log(result);var regex = /\d{4}(-|\/|\.)\d{2}\1\d{2}/ ;var string1 = "2017-06-12" ;var string2 = "2017/06/12" ;var string3 = "2017.06.12" ;var string4 = "2016-06/12" ;console .log( regex.test(string1) ); console .log( regex.test(string2) ); console .log( regex.test(string3) ); console .log( regex.test(string4) );
1 2 3 4 5 6 7 8 9 var regex = /^I love (JavaScript|Regular Expression)$/ ;console .log( regex.test("I love JavaScript" ) );console .log( regex.test("I love Regular Expression" ) );
匹配原理
回溯法,本质上就是深度优先搜索算法。其中退到之前的某一步这一过程,我们称为“回溯”。从上面的描述过程中 ,可以看出,路走不通时,就会发生“回溯”。即,尝试匹配失败时,接下来的一步通常就是回溯。使用场景可以参考我之前一篇的博客全排列
贪婪量词回溯,最先开始全部匹配如果不成功,就一个个减少
惰性量词回溯,最先开始匹配最少情况,如果不成功,再递加。
分支结构回溯,第一个不合适,就换第二个,如此类推。
最后来个书的作者形象总结:
贪婪量词“试”的策略是:买衣服砍价。价钱太高了,便宜点,不行,再便宜点。
惰性量词“试”的策略是:卖东西加价。给少了,再多给点行不,还有点少啊,再给点。
分支结构“试”的策略是:货比三家。这家不行,换一家吧,还不行,再换。
正则优先级 “这里稍微总结一下,竖杠的优先级最低,即最后运算。 只要知道这一点,就能读懂大部分正则。”
正则表达式的构建
匹配预期的字符串
不匹配非预期的字符串
可读性和可维护性
效率
正则表达式编程
1 2 3 4 var regex = /\d/ ;var string = "abc123" ;console .log( regex.test(string) );
1 2 3 4 5 var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/ ;var string = "2017-06-26" ;console .log( string.match(regex) );
1 2 3 4 5 6 7 8 9 10 11 2017 /06 /26 2017.06 .26 2017 -06 -26 var regex = /\D/ ;console .log( "2017/06/26" .split(regex) );console .log( "2017.06.26" .split(regex) );console .log( "2017-06-26" .split(regex) );
1 2 3 4 var string = "2017-06-26" ;var today = new Date ( string.replace(/-/g , "/" ) );console .log( today );
总结 “正则表达式是匹配模式,要么匹配字符,要么匹配位置”。
另外我觉得作者对于知识的定义很有意思, “什么叫知识,能指导我们实践的东西才叫知识。“。学习确实不能浅尝辄止,一定要落地实施。
“说起正则表达式,我之所以会去详细地研究它,最初的动机是,当我分析前端常见的框架和库的源码时,发现一般被卡住的地方就是它。” 以上都是作者原话, 因为作者写这本书的动机是为了分析框架源码,个人远远没有到达这种阶段,而且日常开发中几乎没有使用过,所以这篇文章算是启蒙和参考书吧。