|
Помогите составить регулярку для получения "private" переменных
Короче решил немного по-извращаться с кодом. Есть такой код:
(function () { MYAPP.widget = function(oData) { if (oData) { for(var sKey in oData) { this.setData(sKey, oData[sKey]); } } }; MYAPP.widget.prototype = { _oData: {}, getData : function(sField) { if (sField) { return this._oData[sField]; } else { return this._oData; } }, _privateMethod: function () { var text = '_that_dont_get'; }, setData : function(sKey, value) { this._oData[sKey] = value; console.log("this._oData[sKey]"); } } }()) Мне нужно составить регулярное выражение для получения всех переменных и методов, начинающихся с _ , т.е в данном случае это_oData и _privateMethod Составил такую регулярку: (\_[a-zA-Z0-9\_]+) Но она мне помимо нужных мне переменных возвращает и значения, которые находятся в строках. Подскажите как можно безопасно получить только переменные, может есть уже готовые решения? |
Цитата:
|
тред не читал сразу отвечал
obj = {public:11, _private:12}; for (key in obj) if( key.indexOf('_') ) { alert(key) } |
danik.js Спасибо за ответ. Допустим переменные я вытяну, скажите а как мне теперь заменить эти переменные скажем на какое-нибудь другое произвольное имя. Как сделать так, чтобы при замене не попала строка console.log("this._oData[sKey]"); ?
|
var tmp, res = [], re = /(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g; while( tmp = re.exec( s ) ) if( tmp[1] ) res.push( tmp[1] ); |
Цитата:
var re = /(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g; s2 = s.replace( re, function( t1, t2 ) { return t2 ? "new"+t2 : t1 } ); |
rgl Возвращает "'_that_dont_get'" и ""this._dontget1"". Это строки поэтому их не надо
|
Возвращает, но не заменяет, оставляет как было
Первое сообщение было ответом на вопрос "как найти" оно возвращает только то, что требовалось (одной регуляркой, без циклов не получилось). Второе - заменяет, тут обошлось без циклов |
rgl Объясните пожалуйста, что делает первая часть
(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*') |
Как найти что-то, но не найти его, если оно внутри кавычек? Очень просто, нужно сначала найти все, что в кавычках, и тогда оно будет исключено из дальнейшего поиска.
Как найти то, что в кавычках? Найти открывающую кавычку, найти все что угодно, но только не кавычку, найти закрывающую кавычку. В результате получаем "[^"]*" У этого выражения есть один недостаток - оно замаскированную кавычку по ошибке примет за закрывающую. Чтобы этого не произошло, придется его слегка усложнить: "(\\.|[^"])*" - т.е. либо не-кавычка, либо замаскированный любой символ (в т.ч. возможно и кавычка). (Порядок тут важен, сначала замаскированноечтоугодно, а потом - не кавычка, менять нельзя) Чтобы результат в скобочках не "захватывался", добавляем вопрос с двоеточием "(?:\\.|[^"])*" Потом все то же самое повторяем с одинарными кавычками Далее, когда мы нашли нечто, мы нашли либо что-то в кавычках, либо имя переменной, начинающееся с подчерка. Надо отделить одно от другого, проще всего проверить, пустая строка или нет в скобочках (тех, что без вопроса-двоеточия). Вот и все. |
Часовой пояс GMT +3, время: 06:04. |
|