Показать сообщение отдельно
  #19 (permalink)  
Старый 26.03.2013, 16:48
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от rgl Посмотреть сообщение
Как найти что-то, но не найти его, если оно внутри кавычек? Очень просто, нужно сначала найти все, что в кавычках, и тогда оно будет исключено из дальнейшего поиска.
Как найти то, что в кавычках? Найти открывающую кавычку, найти все что угодно, но только не кавычку, найти закрывающую кавычку.
В результате получаем "[^"]*" У этого выражения есть один недостаток - оно замаскированную кавычку по ошибке примет за закрывающую. Чтобы этого не произошло, придется его слегка усложнить:
"(\\.|[^"])*" - т.е. либо не-кавычка, либо замаскированный любой символ (в т.ч. возможно и кавычка). (Порядок тут важен, сначала замаскированноечтоугодно, а потом - не кавычка, менять нельзя) Чтобы результат в скобочках не "захватывался", добавляем вопрос с двоеточием
"(?:\\.|[^"])*"
Потом все то же самое повторяем с одинарными кавычками
/(["'])(?:\1|.*?[^\\]\1)/g - сразу учитываются одинарные и двойные кавычки (применяются ссылки на подстроки \1), ложные кавычки тоже

ЗЫ: вот так у меня сделано в парсере моего шаблонизатора
/**
 * Заметить кавычки с содержимом в строке на ссылку:
 * __SNAKESKIN_QUOT__номер
 *
 * @private
 * @param {string} str - исходная строка
 * @param {Array=} [opt_stack] - массив для подстрок
 * @return {string}
 */
Snakeskin._escape = function (str, opt_stack) {
	return str.replace(/(["'])(?:\1|.*?[^\\]\1)/g, function (sstr) {
		if (opt_stack) {
			opt_stack.push(sstr);
		}

		return '__SNAKESKIN_QUOT__' + (opt_stack ? opt_stack.length - 1 : '_');
	});
};

/**
 * Заметить __SNAKESKIN_QUOT__номер в строке на реальное содержимое
 *
 * @private
 * @param {string} str - исходная строка
 * @param {!Array} stack - массив c подстроками
 * @return {string}
 */
Snakeskin._uescape = function (str, stack) {
	return str.replace(/__SNAKESKIN_QUOT__(\d+)/g, function (sstr, pos) {
		return stack[pos];
	});
};
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 26.03.2013 в 16:56.
Ответить с цитированием