如何在coffeescript正则表达式中转义双引号?

时间:2012-12-29 00:31:07

标签: regex coffeescript jquery-chaining

我有以下coffeescript代码行(dCnt和sDesc都是jQuery对象),它在移动其位置时对一块HTML进行了一些基本的清理:

dCnt.append(sDesc.html().replace( /<div/gi, '<p' ).replace( /<\/div>/gi, '</p>' ).replace /\sstyle="text-align: center;"/gi, '')

这会输出以下JavaScript:

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/<\/div>/gi, '</p>').replace(/\sstyle="text-align: center;"/gi, ''));

前两个替换没有引起任何问题,但是第三个替换了一些工作来提出coffeescript编译器可以处理的东西,结果对我的喜好太过限制和脆弱。

到目前为止,我发现了:

1)如果我在最终替换周围有括号(),那么coffeescript会将双引号解释为字符串并混淆(它最终会将正斜杠之一解释为除法)。

2)如果我删除了停止MATH错误的括号,那么正则表达式中的任何空格都会混淆编译器 - 输出用空格而不是上面代码的\ s(注意可怕的断开的括号在最后的替换):

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/<\/div>/gi, '</p>').replace / (style = "text-align: center;" / gi), '');

如果替换不在括号括号中(即从代码中删除dCnt.append()并在单独的行上处理),则正则表达式中的空格将导致编译器抛出异常','错误(至少比生成垃圾JavaScript更好......)。

由于需要删除括号(coffeescript中的可选项,虽然我发现它们严重降低了代码的可读性),但是不可能链接两个受此问题影响的函数调用。

任何人都可以提出一个不太脆弱的解决方案来解决这个问题仍然能够使用jQuery链完整吗?

1 个答案:

答案 0 :(得分:1)

问题似乎归结为以下几点:

s.replace(/ /, '')
s.replace / /, ''

被CoffeeScript编译器视为含糊不清,它错误地解决了歧义。对?问题的根源是斜杠后面的空格,而不是双引号。 CS看到了这个:

/ /

作为尝试的分裂而不是正则表达式的字面意思。但是,这个:

/\ /

被解释为匹配单个空格的正则表达式。

我可以想到几个解决方法:

  1. 使用\s甚至[ \t]。我认为这些只是寻找单个空间更正确(当然,将整个“带有正则表达式的错误HTML”放在一边)。
  2. 逃离领先空间:/\ style.../。我实际上更喜欢这种方法而不是正则表达式中的原始空格,因为它使它们更容易计算。
  3. 所以答案真的很少(对不起),但也许确认你不会失去理智。