Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.03.2013, 12:03
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

Помогите составить регулярку для получения "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\_]+)


Но она мне помимо нужных мне переменных возвращает и значения, которые находятся в строках.

Подскажите как можно безопасно получить только переменные, может есть уже готовые решения?
Ответить с цитированием
  #2 (permalink)  
Старый 26.03.2013, 12:36
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от yngwie19
Подскажите как можно безопасно получить только переменные, может есть уже готовые решения?
Тебе нужен парсер javascript-кода, который бы построил AST. Пройдешься потом по дереву и вытянешь нужные переменные. Можешь заюзать «jison»
Ответить с цитированием
  #3 (permalink)  
Старый 26.03.2013, 13:01
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

тред не читал сразу отвечал
obj = {public:11, _private:12};

for (key in obj) if( key.indexOf('_') ) {
    alert(key)
}
Ответить с цитированием
  #4 (permalink)  
Старый 26.03.2013, 13:03
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

danik.js Спасибо за ответ. Допустим переменные я вытяну, скажите а как мне теперь заменить эти переменные скажем на какое-нибудь другое произвольное имя. Как сделать так, чтобы при замене не попала строка console.log("this._oData[sKey]"); ?

Последний раз редактировалось yngwie19, 26.03.2013 в 13:10.
Ответить с цитированием
  #5 (permalink)  
Старый 26.03.2013, 13:24
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

var tmp, res = [],
  re = /(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g;

while( tmp = re.exec( s ) )
  if( tmp[1] )
    res.push( tmp[1] );
Ответить с цитированием
  #6 (permalink)  
Старый 26.03.2013, 13:33
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от yngwie19 Посмотреть сообщение
как мне теперь заменить эти переменные скажем на какое-нибудь другое произвольное имя. Как сделать так, чтобы при замене не попала строка console.log("this._oData[sKey]"); ?
var re = /(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')|(\b_\w*)/g;
s2 = s.replace( re, function( t1, t2 ) { return t2 ? "new"+t2 : t1 } );
Ответить с цитированием
  #7 (permalink)  
Старый 26.03.2013, 13:34
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

rgl Возвращает "'_that_dont_get'" и ""this._dontget1"". Это строки поэтому их не надо

Последний раз редактировалось yngwie19, 26.03.2013 в 13:38.
Ответить с цитированием
  #8 (permalink)  
Старый 26.03.2013, 13:42
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Возвращает, но не заменяет, оставляет как было
Первое сообщение было ответом на вопрос "как найти" оно возвращает только то, что требовалось (одной регуляркой, без циклов не получилось). Второе - заменяет, тут обошлось без циклов
Ответить с цитированием
  #9 (permalink)  
Старый 26.03.2013, 13:59
Аспирант
Отправить личное сообщение для yngwie19 Посмотреть профиль Найти все сообщения от yngwie19
 
Регистрация: 24.10.2009
Сообщений: 39

rgl Объясните пожалуйста, что делает первая часть
(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')
Ответить с цитированием
  #10 (permalink)  
Старый 26.03.2013, 14:12
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

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

Последний раз редактировалось rgl, 26.03.2013 в 14:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пжлста, найти (или написать) скрипт для смены картинок. Artweb Работа 9 25.02.2011 11:28
dragSelector для iframe помогите написать Golizart ExtJS 0 25.07.2010 15:35
Помогите написать скрипт для корзины Deep Элементы интерфейса 1 19.06.2010 14:46
Помогите со скриптом для onClick! Alex13 Общие вопросы Javascript 1 04.11.2009 10:36