使用正则表达式匹配项目的最大数量

时间:2009-08-11 00:48:47

标签: javascript regex

我有一串数字,例如:“1234”,我需要在逗号分隔列表中返回每个数字的最大匹配数字组。

在“1000,1200,1330,1235”中搜索“1234”将返回

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

谢谢!

4 个答案:

答案 0 :(得分:4)

是的,就像Ned说的那样,它对于正则表达式来说真的不是一个好问题......但是......我认为这可能是强制性的,例如:

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

基本上我在这里做的是寻找1可选后跟(2后跟可选...)接着是(任何不是逗号来吃剩下的数字)。

但是,真的,请不要试图这样做: - )

答案 1 :(得分:2)

这让我觉得最好通过编写自定义字符串解析器来完成,而不是使用正则表达式。例如,

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是生锈的(这是未经测试的)但是类似的东西应该有效,并且可能构成解决方案的一部分。

答案 2 :(得分:0)

另一种使用正则表达式的方法:

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

当然,和其他人一样,如果可能的话,我会在这个特定场景中偏离正则表达式解决方案。如果您能够实际解析并将每个数字转换为数字类型,那么我认为这会更灵活。

答案 3 :(得分:0)

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;
}

警告(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;
}