我一直在努力解决最近关于在我们的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任务的不同操作系统:
有关如何在此处进行的任何想法?
我觉得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" />
答案 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, '');