我有两个字符串:
var first = "913 DE 6D 3T 222"
var second = "913 DE 3T 222"
我想检查second
中是否存在first
,最好是 regex
。问题是,indexOf
或includes
会在second
中返回first
不,这是错误的(只有6D
是区别):
first.indexOf(second)
-1
first.includes(second)
false
答案 0 :(得分:3)
使用String#split
和Array#every
方法。
var first = "913 DE 6D 3T 222";
var second = "913 DE 3T 222";
console.log(
second
// split the string by space
.split(' ')
// check all strings are contains in the first
.every(function(v) {
return first.indexOf(v) > -1;
// if you want exact word match then use regex with word
// boundary although you need to escape any symbols which
// have special meaning in regex but in your case I think all are
// alphanumeric char so which is not necessary
// return (new RegExp('\\b' + v + '\\b')).test(first);
})
)

仅供参考:对于较旧的浏览器,请检查polyfill option of every
method。
答案 1 :(得分:1)
这是一个更优雅的解决方案。
首先,我正在使用map功能。在我们的例子中,它返回一个类似这样的数组:
[true,true,true,true]
。然后,使用reduce
函数和logical operators
,我们将获得一个值。如果数组包含至少一个false
值,则最终结果将为false
。
var first = "913 DE 6D 3TT 222";
var second = "913 DE 3T 222";
console.log(second.split(' ').map(function(item){
return first.includes(item);
}).reduce(function(curr,prev){
return curr && prev;
}));
答案 2 :(得分:0)
使用String.match()
函数和特定正则表达式模式的解决方案:
我已更改first
字符串以构成更复杂的案例,重复DE
个值。
var first = "913 DE 6D 3T 222 DE",
second = "913 DE 3T 222",
count = second.split(' ').length;
var contained = (count == first.match(new RegExp('(' + second.replace(/\s/g, "|") + ')(?!.*\\1)', "gi")).length);
console.log(contained);

(?!.*\1)
- 为避免重复匹配是负面的先行断言