JS 编译器删除正则表达式中的转义 () 字符

JS Compiler deleting escape () characters in regular expressions

本文关键字:转义 字符 编译器 删除 正则表达式 JS      更新时间:2023-09-26

我最近一直在努力解决一个关于在 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, '');