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

Posted

技术标签:

【中文标题】在coffeescript正则表达式中应该如何转义双引号?【英文标题】:How should double quotes be escaped in coffeescript regular expressions? 【发布时间】:2012-12-14 04:37:01 【问题描述】:

我有以下的咖啡脚本代码行(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() 并在单独的行上处理),则正则表达式中的空格将导致编译器抛出 Unexpected ',' 错误(这至少比生成垃圾 JavaScript 更可取...)。

由于需要删除括号(coffeescript 中可选,尽管我发现将它们排除在外会严重降低代码的可读性),因此无法链接受此问题影响的两个函数调用。

任何人都可以想出一个不那么脆弱的解决方案来解决这个问题,但仍然可以完整地使用 jQuery 链接吗?

【问题讨论】:

【参考方案1】:

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

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

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

/ /

作为尝试的除法而不是正则表达式文字。但是,这个:

/\ /

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

我能想到几个变通办法:

    使用\s 甚至[ \t]。我认为这些比仅仅寻找一个空格更正确(当然,抛开整个“用正则表达式处理 HTML”问题)。 转义前导空格:/\ style.../。实际上,我更喜欢它而不是正则表达式中的原始空格,因为它使它们更容易计数。

所以真的没有太多答案(对不起),但也许是你没有失去理智的确认。

【讨论】:

我怀疑不会有我错过的“神奇”修复。似乎与coffeescript的课程相当 - 这是我使用它的第一个项目,陪审团仍然非常不确定它是否解决了比它引入的更多问题和效率低下的问题。 CS 大部分都很好(调试除外),但不好的部分相当讨厌,有点像 Rails(除了每次我使用 Rails 时“不好的部分”列表都会变大,而CS 已经基本趋于平稳)。

以上是关于在coffeescript正则表达式中应该如何转义双引号?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中必须转义哪些特殊字符?

正则表达式中必须转义哪些特殊字符?

javascript 星号转义符

在coffeescript / javascript [复制]中使用正则表达式中的字符串中的'+'加号

python正则表达式中的转义问题

正则表达式拆分字符串,不包括可转义引号之间的分隔符