2015-03-19 80 views

回答

1

这会给你不那么复杂的代码和一个循环的结果

function foo(str) { 
 
    var pos = []; 
 
    var words = str.split(' '); 
 
    pos.push(1); 
 
    var prevWordPos; 
 
    for (var i = 1; i < words.length; i++) { 
 
    prevWordPos = pos[i - 1] + words[i - 1].length; 
 
    pos.push((str.indexOf(words[i], prevWordPos) + 1)); 
 
    } 
 
    return pos; 
 
}

+0

编辑更好的代码可读性。谢谢@安德斯安德森 – Avishek 2015-03-19 07:44:46

0

最容易的是搜索正则表达式\b\w并收集 match.start() match.index对于每个匹配。当有匹配时循环。

编辑:错误的语言。大声笑。

+0

*不时可能应该被视为4个字,而不是两个。直到OP来决定什么代表一个字边界我想。 ;-)。 – RobG 2015-03-19 07:11:47

+0

@RobG:对。您可以通过使用适当的lookbehind断言而不是“字边界”来获得“单词”的其他定义。 – Amadan 2015-03-19 08:01:40

0

您可以使用正则表达式replace传递一个函数,而不是替换字符串,这将要求每个匹配功能:

str.replace(/[^ ]+/g, function(match, pos) { 
    console.log("Word " + match + " starts at position " + pos); 
}); 

的正则表达式的含义是:

  • [^ ]:任何排除空间
  • +:一次或多次
  • “克”选项:不仅第一比赛,但他们每个人

换句话说,函数将被称为非空间序列。当然,你可以用不同的方式定义你认为的“单词”。

+0

我不太了解这行代码。我知道'+'连接,'/ g'是在字符串中全局搜索,[^]做什么?还有,还有更多的代码在这里,应该返回每个单词中的第一个字母的位置? – draikonz 2015-03-19 07:18:11

+0

@draikonz:请参阅编辑 – 6502 2015-03-19 07:25:36

0

下面是两个回路一个解决方案,我希望这是足够接近;)

var starts = []; 
 
var str = "How are you doing today?"; 
 
//var count = 0; 
 
var orgStr = str; 
 
while (str.indexOf(" ") > 0) { 
 
    if (starts.length > 0) {  
 
     starts.push(starts[starts.length - 1] + str.indexOf(" ") +1); 
 
    } else { 
 
     starts.push(1); 
 
     starts.push(str.indexOf(" ") +2); 
 
     //alert(str); 
 
    } 
 
    str = str.substring(str.indexOf(" ") + 1); 
 
} 
 
for (var i = 0; i < starts.length; i++) { 
 
    alert(starts[i] + ": " + orgStr.substring(starts[i]-1,starts[i])) 
 
}

+1

非常感谢! 想了好几个小时后,这个工作非常有帮助。阅读代码比编写代码容易得多,希望我可以继续练习它并提出它更容易和更容易! – draikonz 2015-03-19 07:29:01

+0

不客气。 你应该明确地看看@Avishek的答案。 它比我的方式更美丽,尽管我认为它很难阅读:D – 2015-03-19 07:38:16

相关问题