Недавно я изо всех сил пытался решить проблему, связанную с компиляцией регулярных выражений javascript на этапе сжатия/минимизации нашей задачи сборки ant.
По сути, проблема в том, что каждое регулярное выражение javascript, т.е.:
var x = y.replace(/(\d|\.)/g, '');
заменяет escape-символы следующим образом:
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 OS X
- Windows 7
- Юникс
Есть идеи, что делать дальше?
Я считаю слишком большим совпадением то, что ОБА Closure Compiler и YUI Compressor будут страдать от проблемы с разбором регулярных выражений, поэтому, возможно, проблема где-то еще...
Любой вклад высоко ценится.
ОБНОВЛЕНИЕ
Как упоминает Чад ниже, служба Closure Compiler не сообщает о той же проблеме, а это означает, что проблема должно быть так, как ANT (или нижележащие консольные процессы) обрабатывают строки ввода/вывода.
На данный момент это делается с помощью ant-задачи компилятора (google) с использованием ТОГО ЖЕ ФАЙЛА в качестве ввода и вывода для процесса (ПРИМЕЧАНИЕ, что та же проблема возникла при использовании вызова командной строки).
<!-- 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" />
y.replace(/(\d|\.)/g, '');
с помощью задачи Ant Closure Compiler в Ubuntu Linux. Как в «простом», так и в «расширенном» режимах скомпилированный JavaScript сохранил escape-символы регулярного выражения. 16.05.2012