Хобрук: Ваш путь к мастерству в программировании

Компилятор JS удаляет escape-символы (\) в регулярных выражениях

Недавно я изо всех сил пытался решить проблему, связанную с компиляцией регулярных выражений 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" />

  • Можете ли вы предоставить javascript, который вы пытаетесь скомпилировать? 16.05.2012
  • Вы пытались вместо этого использовать символьные скобки? /[\d\.]/g 16.05.2012
  • @DCoder: вот два примера: var number = value.match(/(\d|\.)+/gi)[0];, /\d+$/gi.test(zoneBox.text()) Пожалуйста, помните: я не пытаюсь обойти эту проблему, а пытаюсь решить ее, чтобы мы могли использовать регулярные выражения. @Err, я пробовал использовать символьные скобки, и результат тот же. Проблема в основном в том, что escape-символы удаляются независимо от структуры регулярного выражения. 16.05.2012
  • Пробовали ли вы вызывать компиляторы с теми же аргументами вручную (какие аргументы вы используете)? Обрабатывается ли ввод/вывод ant или средой (если вы передаете компилятору только имена файлов и перенаправляете его вывод в файл в командной строке, у ant не должно быть никакого способа испортить это)? Честно говоря, я не понимаю, как это могло произойти, если только где-то не обрабатывается обработанный вывод и не потребляется escape-символ. 16.05.2012
  • Убедитесь, что вы используете последнюю версию Closure-compiler. Тестирование на close-compiler.appspot.com/home не выявило проблем, о которых вы упомянули. 16.05.2012
  • @Chad Killignsworth: Спасибо, это действительно хороший момент. Хотя файл .jar, который у меня есть, является последней версией (по крайней мере, на прошлой неделе), онлайн-сервис не удаляет обратную косую черту, а это означает, что проблема должна быть где-то еще (может быть, в том, как ANT выполняет процесс?). 16.05.2012
  • В последний раз, когда я видел подобную проблему, оболочка выполняла расширение/замену. 16.05.2012

Ответы:


1

Я не могу воспроизвести эту проблему здесь:

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

Кажется, что-то еще меняет ваш код, вы выполняете какую-либо предварительную или пост-обработку своих скриптов?

16.05.2012
  • Чтобы подтвердить выводы Чеда и Джона, я только что протестировал пример y.replace(/(\d|\.)/g, ''); с помощью задачи Ant Closure Compiler в Ubuntu Linux. Как в «простом», так и в «расширенном» режимах скомпилированный JavaScript сохранил escape-символы регулярного выражения. 16.05.2012
  • Нет, я просто не хотел, чтобы люди думали, что это настолько серьезная ошибка в компиляторе. Я предполагаю, что большинство людей не читают комментарии. 17.05.2012

  • 2

    Этот ответ не раскрывает общую загадку того, какой инструмент в вашем процессе сборки причиняет вред, но он имеет дело с конкретным регулярным выражением, которое вы хотите сопоставить. Как отмечали другие плакаты, . (точка) внутри класса символов не нужно экранировать. Так

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

    можно переписать без обратной косой черты как

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

    и я не думаю, что вам нужны скобки для захвата в этом случае, поэтому мы можем сказать

    var x = y.replace(/[0-9.]/g, '');
    
    18.05.2012
    Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..