我怎么能在一个字符串第二个字符匹配正则表达式:匹配第二个字符
'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