/Java(?!Script)([A-Z]\w*)/g 匹配结果请大家讨论

时间:2022-01-15 06:20:49

这几天翻了一下pdf的犀牛书第六版,一边代码实践加深印象。

当看到正则部分的时候,在260页下部发下如下说明:


/Java(?!Script)([A-Z]\w*)/g 匹配结果请大家讨论


当看完这个例子和说明的时候感觉到有些不对劲。

首先说到了  “但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)具体用法还没领悟。

请大家一起讨论,……