Как избегать двойных кавычек в регулярных выражениях 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 видит это:
/ /
как попытка деления, а не как регулярное выражение. Однако это:
/\ /
интерпретируется как регулярное выражение, которое соответствует одному пробелу.
Я могу придумать пару вариантов работы:
- использование
\s
или даже[ \t]
, Я думаю, что это более правильно, чем просто искать один пробел (конечно, оставляя в стороне весь вопрос "искажения HTML с помощью регулярных выражений"). - Сбежать ведущее пространство:
/\ style.../
, Я на самом деле предпочитаю это необработанным пробелам в регулярных выражениях, так как их легче считать.
Так что на самом деле не так много ответов (извините), но, возможно, подтверждение того, что вы не сходите с ума.