我怎麼能在一個字符串第二個字符匹配正則表達式:匹配第二個字符
'abcdef'.match(???) => ['a', 'c', 'e']
我有這樣的非正則表達式的解決方案:
spl = []; for(var i = 0; i < str.length; i += 2) spl.push(str.charAt(i));
,但尋找的東西更優雅。
我怎麼能在一個字符串第二個字符匹配正則表達式:匹配第二個字符
'abcdef'.match(???) => ['a', 'c', 'e']
我有這樣的非正則表達式的解決方案:
spl = []; for(var i = 0; i < str.length; i += 2) spl.push(str.charAt(i));
,但尋找的東西更優雅。
另一種可能的方法:
'abcdefg'.replace(/.(.)?/g, '$1').split('');
它不需要任何墊片。
有趣的思路。但我相信正則表達式應該是'/(.)./ g' - OP的輸出與第一個字符相匹配,並且當捕獲組不匹配時,不需要替換。 –
聰明的解決方案!你的正則表達式與OP的示例文本「abcde」匹配問題標題(「匹配每個第二個字符」),因此輸出[「b」,「d」],但問題文本表明OP需要[「a」 ,「c」,「e」]代替(第一個字符和其後的所有其他字符)。 –
是的,我的標題有點混亂,但你說得對,謝謝! – georg
您可以使用..?
和ES5 map
function(可以通過一個墊片對於還沒有它本身的瀏覽器提供):
"abcde".match(/..?/g).map(function(value) { return value.charAt(0); });
// ["a", "c", "e"]
你可以做到這一點沒有正則表達式爲好。
'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));
}
爲什麼不省略'i%2 === 0',然後只增加2:';我+ = 2' ... –
@EliasVanOotegem真棒的想法。 '=]'我傾向於過度複雜的東西大聲笑。 –
如果你添加另一種方式來做這件事,你可以省略地圖+過濾器......它是不必要的複雜,慢,愚蠢和龐大......真的很尷尬......如果你想看到過度複雜化,讓我知道:D –
使用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"]
...
顯然,它可能只是「過濾器」,不需要「地圖」。 – georg
你確定你需要爲這個正則表達式? –
同意@FabrícioMatté爲什麼不通過它的長度迭代字符串並獲取charAt(i)? – Tommi