这几天翻了一下pdf的犀牛书第六版,一边代码实践加深印象。
当看到正则部分的时候,在260页下部发下如下说明:
当看完这个例子和说明的时候感觉到有些不对劲。
首先说到了 “但Java后面不能跟随“Script”” 后面又说 ”它可以匹配 “JavaScript”” ,按这两句话看,是不是前后矛盾呢? “JavaScript”难道不是“Java”后面跟随“Script”?
好了文字表达上的歧义暂且放下,node上面拼代码看结果:
> "JavaScript".match(/Java(?! Script)([A-Z]\w*)/g)
[ 'JavaScript' ]
什么鬼,竟然匹配出来了!
那么上面说到的 “但Java后面不能跟随“Script”” 这句话不成立?
接着有提到了 “但不能匹配“JavaScripter””,那我们也node一下:
> "JavaScripter".match(/Java(?! Script)([A-Z]\w*)/g)
[ 'JavaScripter' ]
同样也匹配出来了!
那么这个例子有什么用? (?! Script) 这个约束条件怎么用?
再次分析表达式 (/Java(?! Script)([A-Z]\w*)/g ,发现书中?! Script中间带有一个空格,那么我们把空格去掉试一下:
> "JavaScript".match(/Java(?!Script)([A-Z]\w*)/g)
null
这次“JavaScript”没有匹配到,正确。
> "JavaScripter".match(/Java(?!Script)([A-Z]\w*)/g)
null
但是 "JavaScripter"居然也匹配不到了。
由此看来 此处应该是书中的一个bug。(?! Script)具体用法还没领悟。
请大家一起讨论,……