Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите составить регулярку для получения "private" переменных (https://javascript.ru/forum/misc/36745-pomogite-sostavit-regulyarku-dlya-polucheniya-private-peremennykh.html)

yngwie19 26.03.2013 14:36

rgl, Спасибо Вам большое за решение, подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы

danik.js 26.03.2013 15:49

this['_oData']

Это тоже будет заменено или нет?

yngwie19 26.03.2013 15:57

Нет это менять не надо, думаю так правильно использовать. Поправьте пожалуйста регулярку :)

rgl 26.03.2013 15:58

Цитата:

Сообщение от yngwie19 (Сообщение 242719)
подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы

Цитата:

Сообщение от danik.js (Сообщение 242728)
this['_oData']

Это тоже будет заменено или нет?

Составить безупречную регулярку очень сложно, и она будет большая и запутанная. Классики (напр. Jeffrey Friedl) учат нас искать компромисс между безупречностью и простотой.
Мое выражение споткнется, напр. на такой строке:
/* this isn't good */ _test = 0; console.log( '_test = 0' );

оно не заменит настоящую переменную, но заменит слово внутри строки. Поэтому для полной уверенности стоит сравнить исходный файл и файл с результатами и убедиться что все замены сделаны правильно.

rgl 26.03.2013 16:03

Цитата:

Сообщение от danik.js (Сообщение 242728)
this['_oData']

Это тоже будет заменено или нет?

Это вообще не решаемо, т.к., если пойти дальше тем же путем, то следующим будет вопрос:
var i = '_oData';
// несколько строчек кода
this[i];

yngwie19 26.03.2013 16:08

rgl, можем ли с Вам пообщаться в каком-нибудь чате, у меня есть пара вопросов :)
Например: http://learn.javascript.ru/chat мой ник тот же

rgl 26.03.2013 16:18

Поправлено с учетом возможный комментариев:
var re = /(?:(?:\/\/.*)|(?:\/\*[\s\S]*?\*\/)|"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g;

rgl 26.03.2013 16:23

Нет, в чате общаться не получается. А чем форум плох? Много читателей снижают вероятность, что какая-то ошибка останется незамеченной.

kobezzza 26.03.2013 16:48

Цитата:

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

/(["'])(?:\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];
	});
};

rgl 26.03.2013 17:05

Цитата:

Сообщение от kobezzza
/(["'])(?:\1|.*?[^\\]\1)/g - сразу учитываются одинарные и двойные кавычки (применяются ссылки на подстроки \1), ложные кавычки тоже

Споткнется (не заметит закрывающую кавычку) если перед ней стоит замаскированный обратный слэш, напр.
var s = "abcd\\";


Часовой пояс GMT +3, время: 18:53.