2012-05-16 7 views
0

JSFiddler: http://jsfiddle.net/A3vg6/20/предотвращает замену Сбежал последовательности в JavaScript регулярных выражений

var regex = /(?:window|scope|data|owner)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*/gi; 

    var path = []; 
    var vars = []; 

    var ms = txt.replace(regex, 
     function (match) { 
     var nv = "v" + (path.length + 1); 
      if (match.indexOf("owner.")==0) { 
       match = match.substr(6); 
      } 
      path.push(match); 
      vars.push(nv); 
      return nv; 
     } 
     ); 

Я получаю выход

data.x + data.y + $data.z + xdata => v1 + v2 + $v3 + xv4 

Но правильный вывод должен быть,

data.x + data.y + $data.z + xdata => v1 + v2 + data.z + xdata 

Так что ничего, начиная с $ следует избегать, а также, если данные появляются после того, как любой символ не должен быть заменены. Есть только 4 ключевых слова, окно, область, данные и владелец, эти слова должны быть заменены переменными.

Я ненавижу регулярные выражения, но это должно быть регулярное выражение, как он будет содержать сложную последовательность такой ..

data[ Calculate(x, data.y)] => v1[ Calculate(x,v2)] 

У нас мало успеха сейчас, но у меня есть проблема с новой последовательностью

data[data['x']] + data.x + data.y + $data.y + xdata 

становится

v1v2['x']] +v3 +v4 + data.y + xdata 

Но это должно быть

v1[v2['x']] +v3 +v4 + data.y + xdata 

Ответил:

http://jsfiddle.net/A3vg6/44/

работает правильно.

ответ

1

Попробуйте это регулярное выражение:

/(^|[^\w])(?:window|scope|data|owner)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*/gi 

и изменить свою функцию:

var ms = txt.replace(regex, 
     function (match, prefix) { 
      if (prefix == "$") return match.substr(1); 
      var nv = "v" + (path.length + 1); 
      match = match.substr(1); 
      if (match.indexOf("owner.")==0) { 
       match = match.substr(6); 
      } 
      path.push(match); 
      vars.push(nv); 
      return prefix + nv; 
     } 
     ); 

Попробуйте здесь: http://jsfiddle.net/A3vg6/40/

+0

Спасибо, но XData заменяется тоже XData должен оставаться XData. –

+0

Отредактировано. Примерьте вот это. –

+0

Спасибо за вашу помощь, но она съедает квадратную скобку или круглые скобки. Проверьте мой обновленный вопрос. –

Смежные вопросы