Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.03.2013, 04:14
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вопрос по регулярке (captures)
Имеется строка, для примера "aa".
Имеется много регулярок, генерируемых скриптом, для примера две регулярки:
1) /a/
2) /a+/
Их порядок жестко задан и не может быть изменен. Сами они также не могут быть изменены, поскольку все должно быть автоматизировано.

Необходимо найти наиболее подходящую для строки регулярку, тоесть захватывающую как можно большую часть строки.

Сейчас это делается в цикле, перебором всех регулярок:

var patterns = ['a', 'a+'];
var string = 'aa';

var regexps = patterns.map(function(item){
    return new RegExp(item);
});

var temp = '', index = -1, match, matches;
for (var i = 0; i < regexps.length; i++) {
    matches = string.match(regexps[i]);
    if (matches && (match = matches[0]).length > temp.length) {
        temp = match;
        index = i;
    }
}

alert(index + ':' + temp);
Это очень медленно. Впринципе, если бы требовалось найти первую подходящую регулярку, а не самую "точную", то можно было бы совместить все регулярки в одну.

Вопрос можно ли как-то совместить эти регулярки в одну, но чтобы срабатывала именно самая точная из них?

Вот моя попытка.
var patterns = ['a', 'a+'];
var string = 'aa';


var pattern = patterns.map(function(item, index){
    return ['(', ')'].join(item);
}).join('|');

var regexp = new RegExp(pattern, 'g');

var temp = '', index = -1, match, matches;
var matches = string.match(regexp);
if (matches) {
    for (var i = 1; i < matches.length; i++) {
        if ((match = matches[i]).length > temp.length) {
            temp = match;
            index = i - 1;
        }
    }
}

alert(index + ':' + temp);
alert(matches);

Последний раз редактировалось danik.js, 03.03.2013 в 03:36.
Ответить с цитированием
  #2 (permalink)  
Старый 02.03.2013, 04:28
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Цитата:
Вопрос можно ли как-то совместить эти регулярки в одну, но чтобы срабатывала именно самая точная из них?
Вряд ли, при конкатенации регулярок,, если работают обе, сработает первая из них
alert('aa'.split(/a/).length-1)
alert('aa'.split(/a+/).length-1)
alert('aa'.split(/a|a+/).length-1)

Последний раз редактировалось Deff, 02.03.2013 в 04:33.
Ответить с цитированием
  #3 (permalink)  
Старый 02.03.2013, 17:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
Необходимо найти наиболее подходящую для строки регулярку, тоесть захватывающую как можно большую часть строки.
Сообщение от Deff
alert('aa'.split(/a|a+/).length-1)
только немного иначе
alert('aa'.split(/a+|a/).length-1) // порядок аргументов имеет значение
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 02.03.2013, 17:54
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

nerv_, я ведь написал:
Сообщение от danik.js
Впринципе, если бы требовалось найти первую подходящую регулярку, а не самую "точную", то можно было бы совместить все регулярки в одну.
Регулярки я привел для примера. В реале они другие , их много, и вообще они пишутся не вручную, а генерируются. Упорядочить их будет проблематично, если не невозможно. Мне это нужно для генерации лексера исходного кода (пока что PHP) из файла для программы lex (модифицированного). Используется jison-lex. Ищу способы ускорить парсинг кода.
Ответить с цитированием
  #5 (permalink)  
Старый 02.03.2013, 17:59
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
я ведь написал
какой вопрос (пример), такой ответ
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2013, 03:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Поправил вопрос. Теперь есть кому что сказать?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по each() и перебору строк таблицы battrack jQuery 1 09.02.2012 14:30
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Вопрос по учебнику Invis1ble Сайт Javascript.ru 12 21.03.2011 20:06
Вопрос по работе функций в PHP bayah Серверные языки и технологии 2 12.02.2011 17:42
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49