2013-04-12 107 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

相關問題