如何限制字符串到JavaScript中的特定字符集?

问题描述:

为了把这个上下文中,可以考虑这两个函数:如何限制字符串到JavaScript中的特定字符集?

ml_RestrictToChars = function(input,regex) { 
    var result = '';var c = ''; 
    var rx = new RegExp(regex); 
    for (var i = 0; i < input.length; i++) { 
     c = input.charAt(i); 
     if (rx.test(c)) { 
      result += c; 
     } 
    } 
    return result; 
}; 
ml_OmitChars = function(input,regex) { 
    var rx = new RegExp(regex,'g'); 
    return input.replace(rx,''); 
}; 

第一功能将限制输入到一组特定的字符,第二个将省略从输入任何字符或字符序列。正如你可以在第一个函数中看到的代码所看到的那样,它只会在单个字符类被传入'regex'参数时才起作用,因为包含代码一次只检查一个字符。

考虑输入字符串12-34,现在如果我通过的'[0-9]'正则表达式到所述第一功能和'[^0-9]'到第二功能,我会得到相同的输出按预期:1234

然而,如果使用在第二个函数中的更高级表达式,例如'[^0-9][^0-9]-',我将获得12-的输出。但是,如果我将多个字符类传递给第一个函数,它将返回一个空字符串。

我想知道的是,如果有一种简单的方法(最好是没有循环)做ml_OmitChars的反转,所以它们的工作方式相似吗?

+0

为什么在ml_RestrictToChars函数中测试每个字符? – Johan 2010-09-08 19:54:30

+0

如果它没有使用这种方法测试每个字符,那么将无法排除这些字符。这就是if(rx.test(c))行所做的 - 确定每个字符是否应该包含在结果中。我并不是说这是解决这个问题的唯一方法,我希望有人能够从不同的角度来解决这个问题。 – NightOwl888 2010-09-08 21:52:54

+0

啊,那么你可以使用你的omitchars函数,并返回原始和omitchars函数之间的差异。这将反映你的功能。 – Johan 2010-09-09 06:07:27

匹配每个字符很简单(但速度很慢),并且显示它的工作原理。你现在想要的是匹配一个模式并连接所有的匹配。这样做是这样的:

ml_RestrictToChars = function(input,regex) { 
    var rx = new RegExp (regex, 'g'); 
    var matches = input.match (rx); 
    return matches.join (''); 
}; 

第一行使它成为“全球性”的正则表达式,从而改变比赛的行为()。第二行返回数组中的所有匹配项,最后一行将它们连接成单个字符串并返回。

+0

感谢您花时间完成这项工作。我认为这会做到这一点。 – NightOwl888 2012-12-03 14:17:47