JS正则表达式(从原理和语法到JS正则)
(推荐)JS正则知识点专题://www.jb51.net/article/139831.htm
是有规律的,就像灯塔一样。当你在弦的海洋里不知所措的时候,总能给你一些思路;正规的,就像验钞机,当你不知道用户提交的钞票是真是假的时候,总能帮你一眼识别出来;常规,就像手电筒,当你需要找东西的时候,它总能帮你得到你想要的东西.——斯丁森中文排比练习《正则》节选
在欣赏了一段文学节选后,我们正式梳理了JS中的规律性。这篇论文的主要目的是防止我忘记规律性的一些用法。所以梳理写下来,会提高我的熟练度,作为参考。次要目的是和大家分享。如有错误,请不吝指教,感谢您的配合。
既然这篇文章的标题是“一条龙”,那它一定配得上“龙”,所以它将包括正则化原理、语法列表、JS(ES5)中的正则化、ES6对正则化的扩展,以及实践正则化的思想。我会尽量用简单的方式来谈论这些事情(好像你真的可以用简单的方式来解释)。如果你只想知道如何应用它们,那么你基本上可以阅读第二、第三和第五部分。
一、原则介绍
当我开始使用规律性的时候,我觉得很神奇。计算机是如何根据正则表达式匹配字符串的?直到后来遇到一本叫《计算理论》的书,看到了规律性、DFA、NFA的概念,以及它们之间的关系,才意识到一些东西。
但是,如果真的想从原理上彻底理解正则表达式,那么最好的方法恐怕就是:1。首先,找一本专门研究规律性的书,可以在O'REILLY的《动物故事》系列中找到;2.自己实现一个常规引擎。
本文的重点在于正则性在JS中的应用,所以原理只是简单介绍一下(因为我没有写过正则引擎,也没有深入探讨)。首先,我会粗略地“愚弄”像我这样好奇的婴儿关于规律性的原则。第二,我会了解一些基本的原理知识,这对理解语法和写作规律大有裨益。
1.为什么正则化引擎有效?因为有一个引擎,这和为什么JS可以执行是一样的。还有JS引擎。所谓正则化引擎,可以理解为根据你的正则表达式,用算法模拟一台机器。这台机器有许多状态。通过读取要测试的字符串,在这些状态之间跳转。如果最后止于“大团圆结局”,那么说我愿意,否则说你是个好人。这样就把一个正则表达式转化为一个可以在有限的步骤内计算结果的机器,然后实现引擎。
常规发动机大致可以分为两类:DFA和NFA 1。确定性有限自动机2。NFA(非确定性有限自动机)非确定性有限自动机,大部分是NFA
这里的“确定型”是指对于某个字符的输入,该机的状态肯定会从A跳转到B,而“非确定型”是指对于某个字符的输入,该机可能会有几次状态跳转;这里的“差”是指状态有限,可以在有限的步骤内确定某个字符串是否被接受或发送了一张好卡;这里的“自动机”可以理解为:一旦设定了这台机器的规则,你就可以自己做出判断,不希望任何人看。
DFA引擎不需要回溯,因此匹配效率普遍较高。但是,它不支持捕获组,所以它不支持回溯引用和$,也不支持一些NFA引擎特有的特性,比如Lookaround和非贪婪模式。
如果你想了解更多的规律性,DFA和NFA,你可以看看《计算理论》,然后你可以根据一个正则表达式画一个自动机。
2.知识储备
这一节对你理解正则表达式非常有用,尤其是理解什么是字符,什么是位置。
2.1常规眼中的字符串有——个字符和n 1个位置
在上面的“笑”串中,有8个字符,你可以看到,有9个位置,只有聪明的人才能看到。为什么要有人物和位置?因为位置可以匹配。
那么让我们进一步了解“占有性格”和“零宽度”:
如果一个子正则表达式匹配的是字符,而不是位置,并且会保存在最终的结果中,那么这个子表达式就会占用字符,例如,/ha/(matching ha)占用字符;如果子表达式匹配的是位置,而不是字符,或者匹配的内容没有保存在结果中(实际上也可以看作是位置),那么子表达式就是零宽度的,比如/read(?=ing)/(匹配读数,但只将读数放入结果中。下面将详细介绍语法,这里仅作为示例使用),其中(?=ing)是零宽度,本质上代表一个位置。占有字符互斥,零宽度不互斥。即一个字符只能同时匹配一个子表达式,而一个位置可以同时匹配多个宽度为零的子表达式。例如,/aa/不能匹配A。此字符串中的A只能由常规的第一个A字符匹配,并且
版权声明:JS正则表达式(从原理和语法到JS正则)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。