最近利用一周时间阅读了《精通正则表达式(第3版)》前6章,希望能够精通正则表达式,并且能够撰写《javascript深度理解正则表达式》这样的文章。一周时间太短,我自认为仅仅是达到了“不再畏惧”、“更有信心”的程度,因而本文的目标只能是帮助读者“掌握”正则表达式。
我想正则表达式之所以难,主要体现在以下几个方面:
1)正则表达式的符号晦涩难懂
2)不支持排版(至少javascript目前还不支持)
3)不能设置断点,不能跟踪调试
4)没有真正的标准,不同工具所支持的正则表达式有许多细节上的差异
下文中如涉及正则表达式符号含义不明,请参阅<<javascript正则表达式入门笔记(完整版)>>
正则表达式本质上是一整套的处理字符串的模型,帮助人们利用简短的表达式来实现复杂的算法。早期的正则表达式引擎只有三百多行代码,发展到后来也不到1万行代码。打一个不恰当的比喻,利用正则表达式处理字符串,就像是利用SQL处理数据。正如我们在处理数据时要避免使用复杂SQL,我们在处理字符串时也应当避免使用复杂的正则表达式。下面是一段判断IP地址合法性的代码,比单纯用正则表达式要简单:
var isIPAdress = function(IPStr){ var pttrn = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; var IPObj = pttrn.exec(IPStr); var bool_result = false; if(IPObj){ //添加进一步的识别规则 if(IPStr==="0.0.0.0"){ bool_result = false; }else if(IPStr==="1.1.1.1"){ bool_result = false; }else if(IPObj[1]>=0 && IPObj[1]<=255 && IPObj[2]>=0 && IPObj[2]<=255 && IPObj[3]>=0 && IPObj[3]<=255 && IPObj[4]>=0 && IPObj[4]<=255){ bool_result = true; }else{ bool_result = false; } } return bool_result; }
调试信息:
isIPAdress("10.1.6.255") true
isIPAdress("1.1.1.1") false
isIPAdress("10.1.a.255") false
浅议正则表达式的执行效率
执行下面这个javascript的正则表达式,比较ie/safari/firefox/chrome的执行效率,发现safari和firefox首次打开时较慢但是再刷新可做到瞬间完成,chrome和ie则是每次打开和刷新都慢,这说明javascript在ie和chrome上还是完全基于NFA算法做优化,safari和firefox则可能用到了DFA算法(也可能是缓存)。
var p1 = /X(?:.+)+X/; iJs.put(p1.exec("=XX=========================="));
正则表达式对象:exec方法:
如果正则表达式使用了g作为后缀,则会记住上次执行的结果,执行时会找后面匹配。
如果正则表达式没有使用g作为后缀,则每次执行的结果相同,都是取第一个匹配上的。如果使用了捕获型括号,则匹配结果可通过1/2/3/...后缀获得,参见前面给出的判断IP地址合法性的代码。
var pttrn = /bb/; iJs.showObject(pttrn.exec("abaabbaaa")); iJs.showObject(pttrn.exec("abaabbaaa")); pttrn = /a+/g; iJs.showObject(pttrn.exec("abaabbaaa")); iJs.showObject(pttrn.exec("abaabbaaa"));
调试信息:
[Object] bb |--[string] 0 ------------- bb |--[number] index ------------- 4 |--[string] input ------------- abaabbaaa |--[number] lastIndex ------------- 6 [Object] bb |--[string] 0 ------------- bb |--[number] index ------------- 4 |--[string] input ------------- abaabbaaa |--[number] lastIndex ------------- 6 [Object] a |--[string] 0 ------------- a |--[number] index ------------- 0 |--[string] input ------------- abaabbaaa |--[number] lastIndex ------------- 1 [Object] aa |--[string] 0 ------------- aa |--[number] index ------------- 2 |--[string] input ------------- abaabbaaa |--[number] lastIndex ------------- 4
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 正则表达式
, 字符串
, 代码
, 处理
, javascript正则表达式
, 精通正则表达式
, 正则学习问答
, 复杂
javascript正则
,以便于您获取更多的相关知识。