01.04.2013, 14:44
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
позиция подмасок в в регулярном выражении
пишу конструктор регулярных выражений, есть желание в нем сделать подсветку найденных групп в исходном тексте.
пример - исходный текст:
xxab
aaaa
aaaa
bbbb
baxt
регулярка
/aaa(a)\na(a)aa\nbb(b)/
как найти позиции найденных групп?
чтобы я мог пометить их
xxab
aaaa
aaaa
bbbb
baxt
пример создан искусственно, регулярки могут быть разной сложности (любые) и исходный текст тоже.
|
|
01.04.2013, 22:41
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
В нэте полно online regexp тестеров. Посмотрите как оные устроены.
__________________
29375, 35
|
|
02.04.2013, 03:04
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
Смотрел несколько десятков онлайн конструкторов, не нашел чтобы подсвечивало подгруппы. Или всё совпадение подсвечивает или текстом выдает результат.
Нашел такое решение:
var m= /(s+)(.*?)(l)([^l]*?)(o+)/.exec('this is hello to you');
function indexOfGroup(match, n) {
var ix= match.index;
for (var i= 1; i<n; i++)
ix+= match[i].length;
return ix;
}
alert(indexOfGroup(m, 3));
но минус его в том, что придется добавлять в регулярку дополнительные группы, что будет очень большой геморой при сложной регулярке, ну и придется высчитывать позиции прежних матчей, а если группа в группе, так совсем не пойми что...
Пока думаю остановится на варианте с использованием ajax+php (preg_match PREG_OFFSET_CAPTURE) но постоянно отправлять на сервер запросы не есть гуд.
|
|
02.04.2013, 03:25
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
А никто не говорил, что будет легко.)
Я так понял у вас должна быть работа не с regexp js, а regexp как таковыми и в этом вся сложность. Возможно вам поможет эта вещица.
__________________
29375, 35
Последний раз редактировалось Aetae, 02.04.2013 в 03:28.
|
|
02.04.2013, 12:07
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
edison,
Сложение матчей не дает в результате исходную строку. Допустим, в регулярке есть вложенные скобки, или же скобки со звездой после. Что будет в этом случае? Ну, напр. строка "abcd1d2d3efg" и регулярка /(d\d)*/
|
|
02.04.2013, 12:25
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
Сообщение от edison
|
пишу конструктор регулярных выражений
|
а зачем? (вопрос не риторический, если ты обучаешься то подскажу)
|
|
03.04.2013, 18:25
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
Aetae
Не нашел по ссылке решение задачи, только нашел поиск с опр позиции, а вот позиции подмасок не увидел. Еще там были примеры с index и lastIndex но это позиции вхождения всего шаблона.
rgl
Да я это написал, что если группа в группе, то будут сложности. Ну в теории можно вкладывать такие группы в другую группу, подсчитывать количество символов выкидывать ненужные значения и т.д. и т.п. в общем там кода будет на целый проект)
megaupload
Нет не обучаюсь, пишу под себя так как приходится много регехп составлять и необходим свой инструмент со своими нюансами в реализации от вставки текста из базы и подсчета количества символов, до автоматической замены некоторых участков в самой регулярке.
Остановлюсь тогда на связке ajax+php, спасибо что подумали со.
|
|
04.04.2013, 00:30
|
Аспирант
|
|
Регистрация: 01.04.2013
Сообщений: 58
|
|
rgl Спасибо, но я наверное не в полной мере объяснил что именно хочу сделать.
конструктор уже написан, там нету только подсветки групп. Конструктор является небольшой частью всего функционала. Переносить весь функционал на другой яп будет очень проблематично, сейчас основаня часть это php+js из которого только JS на 500 кб (я говорю о всем функционале, а не только о конструкторе regexp). А так как я изучаю языки всего то около года. То я подумал, что возможно, где-то что-то упустил в мануалах и есть возможность выводить позиции матчей, например как это сделано в пхп. У меня сейчас только 3 выхода, это переписывать полностью клиенскую часть на С, найти возможность реализовать поиск позиции на JS или отправлять регехп в другую среду и получать оттуда уже ответ с позициями. В принципе не очень важная функция и сэкономит мне несколько секунд времени на составление 1 регехп, но из мелочей так и получается ощутимая экономия (до этого вообще приходилось вручную перебирать пару десятков регулярок и пробовать их обрезать, сейчас помогает конструктор и на автомате подставляет уже составленные регулярки и пробует их переделать под исходный текст). Пока пришел к выводу что для меня сейчас рациональнее сделать ajax+php потом попробую почитать мануалы по java,flash возможно там есть нужный мне функционал, чтобы сделать его на клиентской части, а не отправлять постоянно данные на сервер.
|
|
05.04.2013, 11:22
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от edison
|
как найти позиции найденных групп?
|
alert( 'some text bla bla bla text la la la'.replace( /t(ext)/g, function( a, b ) { return '#' + b + '#';}) );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|