我有一串数字,例如:“1234”,我需要在逗号分隔列表中返回每个数字的最大匹配数字组。
在“1000,1200,1330,1235”中搜索“1234”将返回
["1", "12", "1", "123"]
谢谢!
答案 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;
}