要使用的字符串示例:
鉴于:" 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
答案 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