2

我最近一直在努力解决一个关于在我们的 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 Compiler 和 YUI Compressor 都会遇到解析正则表达式的问题,这太巧合了,所以问题可能出在其他地方......

非常感谢任何输入。

更新

正如下面的 Chad 所提到的,Closure Compiler 服务没有报告同样的问题,这意味着问题一定出在 ANT(或底层控制台进程)处理输入/输出字符串的方式上。

目前完成的方法是通过(google)编译器ant任务,使用相同的文件作为进程的输入和输出(注意,通过使用命令行调用发生了同样的问题)。

<!-- 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" />
4

2 回答 2

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, "");

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

于 2012-05-16T16:42:29.320 回答
1

这个答案并没有解决构建过程中什么工具导致恶作剧的普遍谜团,但它确实处理了您想要匹配的特定正则表达式。正如其他海报所指出的那样,. 字符类中的 (dot) 不需要转义。所以

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

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

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

而且我认为在这种情况下您不需要括号来捕获,所以我们可以说

var x = y.replace(/[0-9.]/g, '');
于 2012-05-18T19:38:08.277 回答