所以我想要从另一段文本中删除动态生成的文本..
var string1 = "Hello, my name is irrelevant";
var string2 = "Hello irrelevant, my name is blank";
所以我想要的是string1
被删除"来自string2
的结果为blank
,因为string1
与string2
具有相同的字词,但即使它们处于不同的模式,它们仍会被删除。
这可能吗?如果我有一个非常大的字符串会慢吗?
答案 0 :(得分:3)
从string1
生成正则表达式并使用它来消除string2
中的单词:
var reg = new RegExp('\\b('+string1.match(/\w+/g).join('|')+')\\b','gi');
var unmatched_words = string2.replace(reg,'').match(/\w+/g);
alert(unmatched_words);
这应该会生成string2
但不会出现在string1
中的每个单词的数组。
编辑:正如Guffa所指出的那样,正则表达式也会匹配部分单词,除非它用单词边界匹配字符串(\b
)预订。我已经更新了答案以包含此更改。
var string1 = "Hello, my name is irrelevant";
var string2 = "Hello irrelevant, my name is blank";
var reg = new RegExp('\\b('+string1.match(/\w+/g).join('|')+')\\b','gi');
var unmatched_words = string2.replace(reg,'').match(/\w+/g);
alert(unmatched_words);

答案 1 :(得分:2)
您可以制作第一个字符串中单词的映射,然后遍历第二个字符串中的单词并检查哪些不在映射中。例如:
var string1 = "Hello, my name is irrelevant";
var string2 = "Hello irrelevant, my name is blank";
var map = {};
var words1 = string1.replace(/,/g, '').split(' ');
for (var i = 0; i < words1.length; i++) {
map[words1[i]] = 1;
}
var result = [];
var words2 = string2.replace(/,/g, '').split(' ');
for (var i = 0; i < words2.length; i++) {
if (!(words2[i] in map)) {
result.push(words2[i]);
}
}
document.write(JSON.stringify(result));
&#13;
这将是一个O(n)解决方案,即性能将与字符串的长度成线性(或接近线性),因此对于大字符串将表现得非常好。