Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по регулярке (captures) (https://javascript.ru/forum/misc/36049-vopros-po-regulyarke-captures.html)

danik.js 02.03.2013 04:14

Вопрос по регулярке (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);

Deff 02.03.2013 04:28

Цитата:

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

nerv_ 02.03.2013 17:48

Цитата:

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

Цитата:

Сообщение от Deff
alert('aa'.split(/a|a+/).length-1)

только немного иначе
alert('aa'.split(/a+|a/).length-1) // порядок аргументов имеет значение

danik.js 02.03.2013 17:54

nerv_, я ведь написал:
Цитата:

Сообщение от danik.js
Впринципе, если бы требовалось найти первую подходящую регулярку, а не самую "точную", то можно было бы совместить все регулярки в одну.

Регулярки я привел для примера. В реале они другие , их много, и вообще они пишутся не вручную, а генерируются. Упорядочить их будет проблематично, если не невозможно. Мне это нужно для генерации лексера исходного кода (пока что PHP) из файла для программы lex (модифицированного). Используется jison-lex. Ищу способы ускорить парсинг кода.

nerv_ 02.03.2013 17:59

Цитата:

Сообщение от danik.js
я ведь написал

какой вопрос (пример), такой ответ

danik.js 03.03.2013 03:34

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


Часовой пояс GMT +3, время: 00:40.