Соответствие максимальному количеству элементов с использованием регулярных выражений - PullRequest
0 голосов
/ 11 августа 2009

У меня есть цепочка цифр, например: "1234", и мне нужно вернуть наибольшую сопоставленную группу цифр для каждого числа в списке через запятую.

Поиск «1234» в «1000, 1200, 1330, 1235» вернет

["1", "12", "1", "123"]

Спасибо!

Ответы [ 4 ]

4 голосов
/ 11 августа 2009

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

'(1(2(34?)?)?)[^,]*,'

В основном то, что я здесь делаю, - это поиск 1, за которым, возможно, следует (2, возможно, сопровождается ...), затем (все, что не запятая, чтобы съесть остальную часть числа).

Но, действительно, пожалуйста, не пытайтесь делать это так: -)

2 голосов
/ 11 августа 2009

Мне кажется, что это лучше всего сделать, написав собственный анализатор строк, а не используя регулярные выражения. Так, например,

function maxMatch(num) {
    var s = num.toString();
    var max = 0;
    var n = 0;
    for (var i = 0; i < s.length(); i++) {
        if (s[i] == n) {
            ++n;
        }
        else if (s[i] == '1') {
            n = '2';
        }
        else if (n != 0) {
            max = parseInt(n) > max ? parseInt(n) : max;
            n = 0;
        }
    }
    return max;
}

Мой Javascript ржавый (и это не проверено), но что-то вроде этого должно сработать и может стать частью вашего решения.

0 голосов
/ 11 августа 2009
String.prototype.matchChars= function(str){
    var s= this, i= 0, L= this.length, tem= '';
    while(i< L){
        if(this[i]!= str[i]) return tem;
        tem+= this[i];
        i+= 1;
    }
    return tem;
}

function matchcharsinList(s, A){
    if(typeof A== 'string') A= A.split(/, */);
    for(var j= 0, n= A.length; j<n; j++){
        tem= A[j] || '';
        A[j]= s.matchChars(tem);
    }
    return A;
}

alert (matchcharsinList ('1234', '1000, 1200, 1330, 1235'));

/*
A more useful method might allow case insensitive matches,, and a minimum length of a match:

*/
String.prototype.matchChars= function(str, min, ignorecase){
    var s= this, i= 0, L= this.length, tem= '';
    if(ignorecase){
        s= s.toLowerCase();
        str= str.toLowerCase();
    }
    if(min && str.substring(0, min)!= s.substring(0, min)) return '';
    while(i< L){
        if(this[i]!= str[i]) return tem;
        tem+= this[i];
        i+= 1;
    }
    return tem;
}
0 голосов
/ 11 августа 2009

Еще один способ сделать это с помощью регулярного выражения:

(?<=\s|^)(1234|123|12|1)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...