Как избегать двойных кавычек в регулярных выражениях coffeescript?

У меня есть следующая строка кода coffeescript (и dCnt, и sDesc являются объектами jQuery), которая выполняет некоторую базовую очистку блока HTML при перемещении его местоположения:

dCnt.append(sDesc.html().replace( /<div/gi, '<p' ).replace( /<\/div>/gi, '</p>' ).replace /\sstyle="text-align: center;"/gi, '')

Это выводит следующий JavaScript:

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/<\/div>/gi, '</p>').replace(/\sstyle="text-align: center;"/gi, ''));

Первые две замены не вызывают проблем, но третьему потребовалась небольшая работа, чтобы придумать то, с чем может справиться компилятор coffeescript, и результат, на мой взгляд, слишком ограничен и хрупок.

Итак, я обнаружил, что:

1) Если у меня есть круглые скобки () вокруг последней замены, тогда coffeescript интерпретирует двойные кавычки как строку и запутывается (в итоге интерпретирует одну из прямых косых черт как деление).

2) Если я уберу круглую скобку, которая останавливает ошибку MATH, то любой пробел в регулярном выражении будет путать компилятор - вывод с пробелом вместо \s для приведенного выше кода (обратите внимание на ужасно разбитые скобки в последней заменить):

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/<\/div>/gi, '</p>').replace / (style = "text-align: center;" / gi), '');

Если замена не содержится в наборе круглых скобок (т. Е. Удалить dCnt.append() из кода и обработать его в отдельной строке), то пробел в регулярном выражении заставит компилятор выдать неожиданный символ ',' ошибка (которая по крайней мере предпочтительнее для генерации мусора JavaScript...).

Из-за необходимости удалить круглые скобки (необязательно в coffeescript, хотя я считаю, что их отсутствие серьезно снижает читабельность кода), невозможно связать два вызова функций, которые связаны с этой проблемой.

Может кто-нибудь придумать менее хрупкое решение этой проблемы, которое все еще оставляет возможность использовать цепочку jQuery без изменений?

1 ответ

Проблема, кажется, сводится к этим:

s.replace(/ /, '')
s.replace / /, ''

Компилятор CoffeeScript считает его неоднозначным, и он неправильно разрешает эту неоднозначность. Правильно? Источником проблемы является пробел после косой черты, а не двойные кавычки. CS видит это:

/ /

как попытка деления, а не как регулярное выражение. Однако это:

/\ /

интерпретируется как регулярное выражение, которое соответствует одному пробелу.

Я могу придумать пару вариантов работы:

  1. использование \s или даже [ \t], Я думаю, что это более правильно, чем просто искать один пробел (конечно, оставляя в стороне весь вопрос "искажения HTML с помощью регулярных выражений").
  2. Сбежать ведущее пространство: /\ style.../, Я на самом деле предпочитаю это необработанным пробелам в регулярных выражениях, так как их легче считать.

Так что на самом деле не так много ответов (извините), но, возможно, подтверждение того, что вы не сходите с ума.

Другие вопросы по тегам