JS 正则表达式实例
2017-07-14 本文已影响4人
377b79b94683
心得向文章,不对基础概念作解释
JS的正则引擎使用的是NFA引擎
正则字符串组成,每个字符占据一个宽度匹配机制:
- 从位置0开始,按照表达式的单个子表达式规则来进行匹配
- 匹配在表达式和字符串均被匹配完毕后结束匹配
- 如果字符串已匹配完毕而表达式并未匹配完毕,则需要考虑回溯,如果回溯失败,则本次匹配失败
- 如果字符串未匹配完毕而表达式已经匹配完毕,则在表达式匹配完毕后提交一次匹配结果,然后重新读取表达式,从上次提交结果的位置继续匹配
-
环视,环视会从前一个子表达式结束的位置开始按照环视表达式进行匹配,如果匹配失败,行为和一般匹配规则相同;如果匹配成功,环视并不会拥有字符,也不会控制表达式的匹配位置。在环视表达式之后的新的表达式,会从环视表达式前的表达式结束的位置开始匹配(和环视表达式同一个起点位置)
环视表达式会进行匹配,如第二条即匹配失败因为aa后面的位置无法匹配到aaa字符串,而且无法回溯,因此匹配失败;而第一条的环视表达式则可以匹配成功,因为可以在aa后匹配到环视表达式的值,但是,环视表达式不会拥有这些字符和位置,所以环视表达式后的表达式应该匹配aa后面的b,而非bcdd(环视表达式)后的e
-
对于星号谨慎使用, 因为在极端情况下,星号被回溯为0的时候,虽然没有指定的结果,但可以通过任何值的匹配!
谨慎使用星号符号对字符进行匹配,虽然返回的结果没有表达式中指定的值,但是实际上,结果中的每次匹配都是被通过了的!在一些地方,会让人感到疑惑 - 正则表达式并非按照单个字符进行匹配,而是按照位置来进行匹配
- 当某表达式控制了若干字符之后,位置指针会移动到被控制字符的后面一个位置,作为下个子表达式匹配的起点
- 当发生回溯的时候,并非回溯到前一个子表达式的地方,而是有多少回溯多少,直到所有的结果都被回溯完毕,仍未匹配成功,则匹配失败