26.03.2013, 14:36
|
Аспирант
|
|
Регистрация: 24.10.2009
Сообщений: 39
|
|
rgl, Спасибо Вам большое за решение, подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы
|
|
26.03.2013, 15:49
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
this['_oData']
Это тоже будет заменено или нет?
|
|
26.03.2013, 15:57
|
Аспирант
|
|
Регистрация: 24.10.2009
Сообщений: 39
|
|
Нет это менять не надо, думаю так правильно использовать. Поправьте пожалуйста регулярку
|
|
26.03.2013, 15:58
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от yngwie19
|
подскажите есть ли еще какие-нибудь подводные камни вроде строк: ?
console.log("this._oData[sKey]");
Мне нужно заменить только реальные свойства и методы
|
Сообщение от danik.js
|
this['_oData']
Это тоже будет заменено или нет?
|
Составить безупречную регулярку очень сложно, и она будет большая и запутанная. Классики (напр. Jeffrey Friedl) учат нас искать компромисс между безупречностью и простотой.
Мое выражение споткнется, напр. на такой строке:
/* this isn't good */ _test = 0; console.log( '_test = 0' );
оно не заменит настоящую переменную, но заменит слово внутри строки. Поэтому для полной уверенности стоит сравнить исходный файл и файл с результатами и убедиться что все замены сделаны правильно.
|
|
26.03.2013, 16:03
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от danik.js
|
this['_oData']
Это тоже будет заменено или нет?
|
Это вообще не решаемо, т.к., если пойти дальше тем же путем, то следующим будет вопрос:
var i = '_oData';
// несколько строчек кода
this[i];
|
|
26.03.2013, 16:08
|
Аспирант
|
|
Регистрация: 24.10.2009
Сообщений: 39
|
|
rgl, можем ли с Вам пообщаться в каком-нибудь чате, у меня есть пара вопросов
Например: http://learn.javascript.ru/chat мой ник тот же
Последний раз редактировалось yngwie19, 26.03.2013 в 16:10.
|
|
26.03.2013, 16:18
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Поправлено с учетом возможный комментариев:
var re = /(?:(?:\/\/.*)|(?:\/\*[\s\S]*?\*\/)|"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g;
|
|
26.03.2013, 16:23
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Нет, в чате общаться не получается. А чем форум плох? Много читателей снижают вероятность, что какая-то ошибка останется незамеченной.
|
|
26.03.2013, 16:48
|
|
Быдлокодер;)
|
|
Регистрация: 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, 26.03.2013 в 16:56.
|
|
26.03.2013, 17:05
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от kobezzza
|
/(["'])(?:\1|.*?[^\\]\1)/g - сразу учитываются одинарные и двойные кавычки (применяются ссылки на подстроки \1), ложные кавычки тоже
|
Споткнется (не заметит закрывающую кавычку) если перед ней стоит замаскированный обратный слэш, напр.
var s = "abcd\\";
|
|
|
|