在这种情况下,我试图从包含这些字母的第一个元素中获取一个字符串数组,直到在这种情况下包含这些字母的最后一个元素。
首先输入是一个句子,所以我用空格分割它。然后我试图从indexOf('IN')到lastIndexOf('NN')得到一个切片,但是得到一个空数组。
以下是我的尝试:
var str = "weather(NN) in(IN) boston(NN)"
str.split(' ').slice(str.split(' ').indexOf('IN'), str.split(' ').lastIndexOf('NN')+1);
我怎样才能得到它["in(IN)", "boston(NN)"]
或者如果字符串是“(IN)波士顿(NN)马萨诸塞州(NN)的天气(NN)”,我得到["in(IN)", "boston(NN)", "massachusetts(NN)"]
?< / p>
答案 0 :(得分:1)
找到符合条件的子字符串,然后将其拆分。第一部分使用正则表达式搜索以(IN)结尾的字符串。第二部分找到(NN)的最后一个索引,然后在(NN)中将4个字符加上4。
像这样:
var str = "weather(NN) in(IN) boston(NN)";
str.substring(str.search(/[^\s]+\(IN\)/), str.lastIndexOf('(NN)') + 4).split(' ')
//["in(IN)", "boston(NN)"]
它也适用于:
var str = "weather(NN) in(IN) boston(NN) is(VBZ)";
//["in(IN)", "boston(NN)"]
var str = "bad(JJ) weather(NN) in(IN) boston(NN) is(VBZ)";
//["in(IN)", "boston(NN)"]
答案 1 :(得分:1)
indexOf
和lastIndexOf
方法不查找数组项中的子字符串,它们只查找完整项的匹配项。
您可以使用reduce
和reduceRight
方法来搜索数组:
var str = "weather(NN) in(IN) boston(NN)";
var arr = str.split(' ');
var first = arr.reduce(function(p, c, i){
return p != -1 ? p : c.indexOf('IN') != -1 ? i : -1;
}, -1);
var last = arr.reduceRight(function(p, c, i, a){
return p != -1 ? p : c.indexOf('NN') != -1 ? i : -1;
}, -1);
arr = arr.slice(first, last + 1);
注意:仅在IE9及更高版本中支持Array.reduce
和Array.reduceRight
方法。 (对于问题中使用的Array.index
和Array.indexOf
方法也是如此,因此它不会更改要求。)