JS Compiler删除正则表达式中的转义(\)字符

时间:2012-05-16 09:13:42

标签: javascript regex ant google-closure-compiler yui-compressor

我一直在努力解决最近关于在我们的ant构建任务的压缩/最小化阶段编译javascript正则表达式的问题。

基本上,问题是每个javascript正则表达式,即:

var x = y.replace(/(\d|\.)/g, '');

获取其转义字符并将其替换为以下内容:

var x = y.replace(/(d|.)/g, '');

由于项目进展迅速而我的测试因构建阶段的问题而导致测试失败,这已经变得非常烦人。

这些是我尝试的内容:

编译工具:

形成正则表达式的不同方法:

// Same problem occurs when regex placed inside a string
var x = y.replace(new RegExp('(\\d|\\.)', 'g'), ''); 

从Ant中调用编译器/压缩器的不同方法:

<!-- Closure Compiler Ant Task -->
<taskdef name="jscomp" classname="com.google.javascript.jscomp.ant.CompileTask"
         classpath="lib/compiler.jar"/>

<!-- Executable called from command line -->
<exec executable="java" dir=".">
         <arg line="-jar lib/compiler.jar" />
         <!-- other args -->
</exec>

从以下位置运行Ant任务的不同操作系统:

  • Mac OSX
  • Windows 7
  • 的Unix

有关如何在此处进行的任何想法?

我觉得Closure编译程序和YUI Compressor解析正则表达式时遇到问题太巧合了,所以问题可能就在其他地方......

任何输入都非常赞赏。

更新

如下面的Chad所述,Closure Compiler service不会报告相同的问题,这意味着问题必须与ANT(或底层控制台进程)处理输入/输出字符串的方式有关。

目前这样做的方法是通过(谷歌)编译器ant任务,使用SAME FILE作为进程的输入和输出(注意通过使用命令行调用发生了同样的问题)。

<!-- CLOSURE COMPILER MACRO -->
<!-- @see http://code.google.com/p/closure-compiler/wiki/BuildingWithAnt -->
<macrodef name="compile">
    <attribute name="file" />
    <sequential>
        <echo>Compiling @{file}</echo>
        <jscomp compilationLevel="simple" warning="quiet"
                debug="false" output="@{file}">
            <sources dir=".">
                <file name="@{file}"/>
            </sources>
        </jscomp>
    </sequential>
</macrodef> 

<!-- ACTUAL USAGE -->
<compile file="${local.output.dir}/app.js" />

2 个答案:

答案 0 :(得分:3)

我无法在此处重现此问题:

http://closure-compiler.appspot.com/home

此代码:

// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print
// ==/ClosureCompiler==

y.replace(/(\d|\.)/g, '');

编译为:

y.replace(/(\d|\.)/g, "");

看起来其他东西正在改变您的代码,您是否对脚本进行任何预处理或后处理?

答案 1 :(得分:1)

这个答案并没有解决构建过程中哪个工具导致恶作剧的一般谜团,但它确实处理了你想要匹配的特定正则表达式。正如其他海报所述,。字符类中的(点)不需要转义。所以

var x = y.replace(/(\d|\.)/g, '');

可以在没有反斜杠的情况下重写

var x = y.replace(/([0-9.])/g, '');

我认为在这种情况下你不需要括号来捕捉,所以我们可以说

var x = y.replace(/[0-9.]/g, '');