Javascript-替换字符串的子字符串中的字符

时间:2019-02-04 09:33:47

标签: javascript regex

我有一个类似"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 /”上的“ /”,我不希望这样。

如何实现?

2 个答案:

答案 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)