2015-02-27 3 views
0

Ok peeps .. Так что у меня есть строковая переменная, которая содержит outerHTML элемента таблицы. Это не моя удобная, работа и это грязного, есть белое пространство везде, ненужные строки-брейки и любит ...Есть ли способ получить «индекс» поиска RegExp, а не «lastIndex»?

Я собирался попытаться написать некоторые JS для xify или «привести в порядок» код, табулировать строки, удалять пробелы и т. д., когда я решил в конце концов взять гангер на то, как RegExp работал в поиске строки ...

Я в процессе понимания как работает RegExp.lastIndex и как часть визуального обучения мне хотелось отобразить строку, которую я искал в консоли e с цветным стилем вокруг выражения в месте нахождения результатов поиска ...

И вот моя проблема. Если я хочу охватить выражение (ы), которое искал с помощью %c, чтобы его стиль, мне нужен как начальный, так и конечный индекс (lastIndex) выражения ...

Теперь я могу справиться с этим, если выражение такое слово, как /hello/, я просто вычитаю длину свойства .source. Но что, если выражения /\w/, указывающие на что-либо, что является словом.

Q. Как я могу найти индекс начала слова (ов)?

Ниже приведен пример пример того, чего я пытаюсь достичь. На данный момент вызов str.src(exp_3) не выполняет никаких действий, но ниже приведен пример console.warn(), который показывает, какого результата я хочу достичь от указанного вызова.

Object.defineProperty(String.prototype,'src',{value:function(e){ 
    src = e.source; 
    if(src[0] != '\\')   len = src.length; 
     else if(src == '\\s') len = 1; 
      else    len = 0; 
    aEd = []; 
    aSty = []; 
    prev = 0; 
    while(e.test(this)){ 
     f = e.lastIndex; 
     s = f-len; 
     if(s) aEd.push(this.slice(prev, s)); 
     aEd.push('%c', this.slice(s,f), '%c'); 
     aSty.push('background:teal;color:silver', ''); 
     prev = f; 
    } 
    aEd.push(this.slice(f,this.length)); 
    sEd = aEd.join(''); 
    sx = '"'+ sEd +'","'+ aSty.join('","') +'"'; 
    eval('console.log('+sx+')'); 
}}); 

$(document).ready(function(){ 
    str = 'Is this all this is?'; 
    exp_1 = /is/gi; 
    exp_2 = /\s/g; 
    exp_3 = /\w/g; 

    str.src(exp_1); 
    str.src(exp_2); 
    str.src(exp_3); 

    console.warn(
     '%cIs%c %cthis%c %call%c %cthis%c %cis?%c', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','' 
    ); 
}); 

Be Kind выглядывает, я говорил, что я обучения ...

+0

Мне сложно понять, какую проблему вы пытаетесь решить с этим. Не могли бы вы упростить проблему? –

+0

, пожалуйста, просто запустите код в консоли хром, я хочу, чтобы «.log()» отображался для вызова 'str.src (exp_3)', чтобы он выглядел так же, как и '.warn()'. 'lastIndex' в цикле даст мне индекс в конце каждого слова, как мне получить индекс в начале каждого слова? конечно, когда выражение найдено 'lastIndex' происходит от чего-то вроде' string.indexOf (..) + expression.source.length', так как я могу получить доступ к 'string.indexOf (..)', если он есть. Извинения, которые я не могу по-настоящему смягчить, поскольку я не знаю, как объяснить это лучше :( – LostInCyberSpace

+0

Есть ли причина, по которой вы захотите это сделать, а не использовать существующий XML-декодер, такой как [vkbeautify] (https : //code.google.com/p/vkbeautify/) –

ответ

0

Вы были очень близко к решению.

Object.defineProperty(String.prototype,'src',{value:function(e){ 
    src = e.source; 
    aEd = []; 
    aSty = []; 
    prev = 0; 

    while(match = e.exec(this)){ 
     f = e.lastIndex; 
     s = match.index; 
     if(s) aEd.push(this.slice(prev, s)); 
     aEd.push('%c', this.slice(s,f), '%c'); 
     aSty.push('background:teal;color:silver', ''); 
     prev = f; 
    } 
    aEd.push(this.slice(f,this.length)); 
    sEd = aEd.join(''); 
    sx = '"'+ sEd +'","'+ aSty.join('","') +'"'; 
    eval('console.log('+sx+')'); 
}}); 

$(document).ready(function(){ 
    str = 'Is this all this is?'; 
    exp_1 = /is/gi; 
    exp_2 = /\s/g; 
    exp_3 = /\w/g; 

    str.src(exp_1); 
    str.src(exp_2); 
    str.src(exp_3); 

    console.warn(
     '%cIs%c %cthis%c %call%c %cthis%c %cis?%c', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','', 
     'background:teal;color:silver','' 
    ); 
}); 

К слову, '?' не считается символом слова.

+0

чувак, ты спасатель жизни, я думал, что это будет холодно, подумал, что я это объяснил ... видят, что вы говорите ссылку 'e.exec()' на переменная, чтобы вызвать индекс! гений ...Я не знал, что «RegExp» даже имеет свойство индекса. Еще раз спасибо. проверит его, затем примет ответ – LostInCyberSpace

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