从字符串中删除字符串中的每个单词

时间:2015-09-14 22:16:44

标签: javascript jquery html

所以我想要从另一段文本中删除动态生成的文本..

  var string1 = "Hello, my name is irrelevant";
  var string2 = "Hello irrelevant, my name is blank";

所以我想要的是string1被删除"来自string2的结果为blank,因为string1string2具有相同的字词,但即使它们处于不同的模式,它们仍会被删除。

这可能吗?如果我有一个非常大的字符串会慢吗?

2 个答案:

答案 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;
&#13;
&#13;

这将是一个O(n)解决方案,即性能将与字符串的长度成线性(或接近线性),因此对于大字符串将表现得非常好。