我最近一直在努力解决一个关于在 ant 构建任务的压缩/最小化阶段编译 javascript 正则表达式的问题。
基本上,问题是每个javascript正则表达式,即:
var x = y.replace(/(d|.)/g, '');
按如下方式删除和替换其转义字符:
var x = y.replace(/(d|.)/g, '');
随着项目进展迅速,并且由于构建阶段的此类问题,我的测试不断失败,这变得非常烦人。
这些是我尝试过的事情:
编译器工具:
- 谷歌闭包编译器
- YUI压缩机
形成正则表达式的不同方法:
// 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
- 视窗 7
- Unix
关于如何在这里进行的任何想法?
我发现闭包编译器和 YUI 压缩器都会遇到解析正则表达式的问题,这太巧合了,所以也许问题出在其他地方......
任何意见非常感谢。
更新
正如Chad在下面提到的,闭包编译器服务不会报告相同的问题,这意味着问题必须出在ANT(或底层控制台进程(处理输入/输出字符串的方式上。
目前完成此操作的方式是通过(google(编译器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" />
我无法在这里重现此问题:
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, "");
似乎还有其他东西正在更改您的代码,您是否对脚本进行任何预处理或后处理?
这个答案并没有解决构建过程中哪个工具导致恶作剧的一般谜团,但它确实处理了你想要匹配的特定正则表达式。 正如其他海报所指出的,.字符类中的 (点( 不需要转义。 所以
var x = y.replace(/(d|.)/g, '');
可以在没有反斜杠的情况下重写为
var x = y.replace(/([0-9.])/g, '');
我认为在这种情况下您不需要括号来捕获,所以我们可以说
var x = y.replace(/[0-9.]/g, '');