2014-10-04 16 views
3

来表达这个问题,最简单的方法是在REPL一个小例子:空间和散列(#)导致错误作为咖啡正则表达式?

coffee> "hello".split(/: #/) #this is fine 
[ 'hello' ] 
coffee> "hello".split(/\s#/) #all good here too 
[ 'hello' ] 
coffee> "hello".split(/ #/) #wtf?? 
[stdin]:1:20: error: missing) 
"hello".split(/ #/) 

为什么最后的正则表达式不起作用?从左右玩看起来似乎任何正则表达式匹配都会有错误^ +.*#.*$请注意,这是正则表达式开始处的空格。 (例如/ foo#bar/但不是/foo bar#baz/)。

这是解析器中的错误吗?

(上Arch Linux运行CoffeeScript version 1.7.1

回答

3

因为咖啡是词法分析,试图找出如果第一/是除法运算符或正则表达式的开始,而猜错在这种情况下。 Here是相关代码。我不确定这是否是一个错误。

如果你把一个文件:

"hallo".match/#/ 
    1 

,并使用coffee -p你会看到,它被解析为除法运算符。 如果你在开始时添加一个非捕获组,你会得到一个表达式(几乎是,因为它占用了更多的空间和正常的正则表达式编译时间),与你所瞄准的表达式相当:

"hall #o".match /(?:) #/ 

编辑:

由于mu is to short指出,这可能是更容易只是把一个反斜杠在空间的前面。

"hall #o".match /\ #/ 
+1

我可能会一起去'/ \#/',反斜杠是平时[做我想做的杂牌(http://stackoverflow.com/a/9492992/479863)。 – 2014-10-04 18:12:28

+0

是的,这也可以。我会编辑它。 – 2014-10-04 18:16:58

+1

啊,我一直在试着做'/ \#/'来试着让它起作用(不会)。改为逃离空间的好处。我们认为这是一个错误吗?我应该在github上打开一个问题吗?再次感谢。 – 2014-10-05 02:04:31