我有一个类似"this/ is an example abc/def/fgh/uio to give you an example"
我想定位最长的单词,并在此子字符串上用"/"
替换任何"+"
。
我设法找出最长的单词,但我会知道如何用"/"
替换所有"+"
,但我不知道如何仅用最长的单词替换"/"
这就是我到目前为止所拥有的
//identify longest word in string
function longestWord(str) {
var words = str.split(' ');
return words.reduce(longer);
}
function longer(champ, contender) {
return (contender.length > champ.length) ? contender: champ;
}
//purely given an exemple, some strigns won't be exactly like this
var text2 = "this/ is an example abc/def/fgh/uio to give you an example"
if (longestWord(text2) > 30 ) {
text2.replace(/\//g, ' / ');
}
问题在于,这还将替换子字符串“ this /”上的“ /”,我不希望这样。
如何实现?
答案 0 :(得分:9)
您的longestWord
函数返回字符串中最长的单词,因此您可以单独将该字符串(不是正则表达式)传递为.replace
的第一个参数,然后用最长的单词上的/\//g
替换为第二个参数:
function getLongestWord(str) {
var words = str.split(' ');
return words.reduce(longer);
}
function longer(champ, contender) {
return (contender.length > champ.length) ? contender: champ;
}
var text2 = "this/ is an example abc/def/fgh/uio to give you an example"
const longestWord = getLongestWord(text2);
const output = text2.replace(longestWord, longestWord.replace(/\//g, '+'));
console.log(output);
答案 1 :(得分:1)
@CertainPermance的解决方案比这要优雅得多(我认为是高性能的),但是当我写下答案时,我认为我也应该把它放进去。
实际上,这非常相似,尽管在这种情况下,我们获得了单词的索引并将其用于执行替换,在撰写本文时,我认为这是必要的。现在,寻找更好的解决方案,我意识到不需要检查,因为字符串中最长的单词将不会包含其他任何单词,因此简单地对其进行替换就容易又安全了。
const data = "this/ is an example abc/def/fgh/uio to give you an example";
const getLongestWordIndex = stringIn => stringIn
.split(' ')
.reduce(
(prev, curr, i) => curr.length > prev.length ? {
index: i,
length: curr.length
} : prev,
{
length: -1,
index: -1
}
).index
const replaceLongestWord = (sentence, replacer) => {
const longestWordIndex = getLongestWordIndex(sentence);
const words = data.split(' ');
return Object.values({
...words,
[longestWordIndex]: replacer(words[longestWordIndex])
}).join(' ')
}
const wordReplaceFunction = word => word.replace(/\//g, '+')
const result = replaceLongestWord(data, wordReplaceFunction);
console.dir(result)