2013-04-12 82 views
2

我怎么能在一个字符串第二个字符匹配正则表达式:匹配第二个字符

'abcdef'.match(???) => ['a', 'c', 'e'] 

我有这样的非正则表达式的解决方案:

spl = []; for(var i = 0; i < str.length; i += 2) spl.push(str.charAt(i)); 

,但寻找的东西更优雅。

+3

你确定你需要为这个正则表达式? –

+0

同意@FabrícioMatté为什么不通过它的长度迭代字符串并获取charAt(i)? – Tommi

回答

6

另一种可能的方法:

'abcdefg'.replace(/.(.)?/g, '$1').split(''); 

它不需要任何垫片。

+1

有趣的思路。但我相信正则表达式应该是'/(.)./ g' - OP的输出与第一个字符相匹配,并且当捕获组不匹配时,不需要替换。 –

+0

聪明的解决方案!你的正则表达式与OP的示例文本“abcde”匹配问题标题(“匹配每个第二个字符”),因此输出[“b”,“d”],但问题文本表明OP需要[“a” ,“c”,“e”]代替(第一个字符和其后的所有其他字符)。 –

+0

是的,我的标题有点混乱,但你说得对,谢谢! – georg

3

您可以使用..?ES5 map function(可以通过一个垫片对于还没有它本身的浏览器提供):

"abcde".match(/..?/g).map(function(value) { return value.charAt(0); }); 
// ["a", "c", "e"] 
5

你可以做到这一点没有正则表达式为好。

'abcdef'.split("").filter(function(v, i){ return i % 2 === 0; }); 

如果IE < = 8的支持是一个问题,您可以添加this polyfill


另一种解决方案,更加冗长,但具有更好的性能,它不需要垫片:

var str = "abcdef", output = []; 
for (var i = 0, l = str.length; i < l; i += 2) { 
    output.push(str.charAt(i)); 
} 

JSPerf

+1

为什么不省略'i%2 === 0',然后只增加2:';我+ = 2' ... –

+0

@EliasVanOotegem真棒的想法。 '=]'我倾向于过度复杂的东西大声笑。 –

+0

如果你添加另一种方式来做这件事,你可以省略地图+过滤器......它是不必要的复杂,慢,愚蠢和庞大......真的很尴尬......如果你想看到过度复杂化,让我知道:D –

2

使用Array.prototype.map是一个选项,太:

var oddChars = Array.prototype.map.call('abcdef', function(i,k) 
{ 
    if (k%2===0) 
    { 
     return i; 
    } 
}).filter(function(x) 
{ 
    return x; 
    //or if falsy values are an option: 
    return !(x === undefined); 
}); 

oddChars现在["a","c","e"] ...

+0

显然,它可能只是“过滤器”,不需要“地图”。 – georg

相关问题