两个字符串中的独特单词联盟

时间:2017-03-30 01:30:23

标签: javascript regex

要使用的字符串示例:

鉴于:" FORD EF FALCON SEDAN"和#34;福特轿车4dr"
需要:" FORD EF FALCON SEDAN 4dr"

使用javascript正则表达式,下面的代码尝试删除重复的单词"不区分大小写"如果这样的词再次重复,那么保留单词的第一个实例并删除相同单词的后续重复。

let myString = str1+' '+str2; myString.replace(/\b(\w+)\b.*\b\1\b/gi, "$1")

正在给予#34; FORD轿车4dr"这是错的。我该如何解决? THX

3 个答案:

答案 0 :(得分:2)

不要使用正则表达式。这是一个简单的javascript解决方案。在以后的版本(我们获得Set类型)或使用像lodash这样的库时,它会更容易。

// Input
var str1 = "FORD EF FALCON SEDAN";
var str2 = "Ford sedan 4dr";
   
// Make a case-insensitive map.
var key = function(s) {return s.toUpperCase()}
var map = {};

// All words, whitespace-separated, as an array.
var words = [str1, str2].join(' ').split(/\s+/);

// Unique words
var unique = [];

// Find unique words.
words.forEach(function (word) {
  if (!(key(word) in map)) {
    unique.push(word);
  }
  map[key(word)] = 1;
});

// Join back to a string.
var result = unique.join(' ');
console.log(result);

在lodash中非常容易=)

const strings = [
"FORD EF FALCON SEDAN",
"Ford sedan 4dr",
];

const result = _(strings)
  .map(s => _.split(s, ' '))
  .flatten()
  .uniqBy(_.toUpper)
  .join(' ')
  
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

答案 1 :(得分:2)

我认为使用数组方法是一种易于理解的方法来解决这个问题。

如果结果字符串只能在所有大写字母中,那么转换为高位,拆分字符串以获取数组,然后过滤该数组非常容易:

let str1 = "FORD EF FALCON SEDAN"
let str2 = "Ford sedan 4dr"

let result = (str1 + ' ' + str2)
  .toUpperCase()
  .split(' ')
  .filter(function(w, i, words) { return i === words.indexOf(w) })
  .join(' ')

console.log(result)

如果你想保留首先出现的单词的大写或小写,那么我猜你在使用.findIndex()代替.indexOf()进行过滤时会进行不区分大小写的测试:

let str1 = "FORD EF FALCON SEDAN"
let str2 = "Ford sedan 4dr"

let result = (str1 + ' ' + str2)
  .split(' ')
  .filter(
    (w,i,words) => i === words.findIndex(v => v.toUpperCase() === w.toUpperCase())
  ).join(' ')

console.log(result)

答案 2 :(得分:0)

最好的办法是拆分单词并检查数组。

如果您愿意,可以使用正则表达式,但只删除1个重复的 每次更换。

每次都必须从头开始。

即。 while ( myString.replace(/\b((\w+)\b.*?)\b\2\b/i, "$1")

我不是JS人,所以我假设replace()返回一个值。

使用此正则表达式/\b((\w+)\b.*?)\b\2\b/i

解释

 \b 
 (                             # (1 start)
      ( \w+ )                       # (2)
      \b .* 
 )                             # (1 end)
 \b \2 \b