替换文字但保留案例

时间:2013-06-23 19:48:32

标签: javascript

我有一组我需要替换的字符串,但我需要保留字母的大小写。输入字和输出字的长度都相同。

例如,如果我需要将“abcd”替换为“qwer”,则应该发生以下情况:

"AbcD" translates to "QweR"
"abCd" translates to "qwEr"

等等。

现在我正在使用JavaScript的replace,但大写字母在翻译时丢失了。

r = new RegExp( "(" + 'asdf' + ")" , 'gi' );
"oooAsdFoooo".replace(r, "qwer");

任何帮助将不胜感激。

8 个答案:

答案 0 :(得分:6)

这是一个帮手:

function matchCase(text, pattern) {
    var result = '';

    for(var i = 0; i < text.length; i++) {
        var c = text.charAt(i);
        var p = pattern.charCodeAt(i);

        if(p >= 65 && p < 65 + 26) {
            result += c.toUpperCase();
        } else {
            result += c.toLowerCase();
        }
    }

    return result;
}

然后你可以:

"oooAsdFoooo".replace(r, function(match) {
    return matchCase("qwer", match);
});

答案 1 :(得分:1)

String.prototype.translateCaseSensitive = function (fromAlphabet, toAlphabet) {
    var fromAlphabet = fromAlphabet.toLowerCase(),
        toAlphabet = toAlphabet.toLowerCase(),
        re = new RegExp("[" + fromAlphabet + "]", "gi");

    return this.replace(re, function (char) {
        var charLower = char.toLowerCase(),
            idx = fromAlphabet.indexOf(charLower);

        if (idx > -1) {
            if (char === charLower) {
                return toAlphabet[idx];
            } else {
                return toAlphabet[idx].toUpperCase();
            }
        } else {
            return char;
        }
    });
};

"AbcD".translateCaseSensitive("abcdefg", "qwertyu")

将返回:

"QweR"

答案 2 :(得分:1)

您可以创建自己的替换功能,例如

 if(!String.prototype.myreplace){
String.prototype.myreplace = (function(obj){
    return this.replace(/[a-z]{1,1}/gi,function(a,b){
       var r = obj[a.toLowerCase()] || a;
        return a.charCodeAt(0) > 96? r.toLowerCase() : r.toUpperCase();
    });
});
}

这会接收一个映射不同字母的对象。它可以被称为如下

  var obj = {a:'q',b:'t',c:'w'};

  var s = 'AbCdea';
  var n = s.myreplace(obj);
  console.log(n);

这意味着如果需要,您可以使用不同的映射传递不同的对象。这是一个简单的fiddle显示一个例子(注意对象全部是小写的,但函数本身也会查看字符串的大小写)

答案 3 :(得分:1)

这应该在保留案件的同时取代。如果有人发现此解决方案存在任何缺陷,请告知我们。我希望这有帮助。感谢您!

function myReplace(str, before, after) {

      var match=function(before,after){
        after=after.split('');
        for(var i=0;i<before.length;i++)
          {

            if(before.charAt(i)==before[i].toUpperCase())
              {
                after[i]=after[i].toUpperCase();
              }
            else  if(before.charAt(i)==before[i].toLowerCase())
              {
                after[i]=after[i].toLowerCase();
              }
            return after.join('');
          }

      };
           console.log(before,match(before,after));
          str =str.replace(before,match(before,after)); 


      return str;
    }

    myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

答案 4 :(得分:1)

我有一个句子,其中我必须用另一个单词替换每个单词,并且该单词可以长于或短于其替换单词,因此它与问题类似,但不是固定长度,而是动态的。

我的解决方案

为简单起见,我只关注一个单词。

const oldWord = "tEsT";
const newWord = "testing";

拆分两个单词,以便我可以遍历每个字母。

const oldWordLetters = oldWord.split("");
const newWordLetters = newWord.split("");

现在,我将遍历newWord个字母并使用其索引来获取相同位置的相应oldWord字母。然后,我将检查旧字母是否为大写字母,然后将新字母也设置为相同的大写字母。

for (const [i, letter] of newWordLetters.entries()) {
  const oldLetter = oldWordLetters[i];

  // stop iterating if oldWord is shorter (not enough letters to copy case).
  if (!oldLetter) {
    break;
  }

  const isCapital = oldLetter === oldLetter.toUpperCase();

  // make the new letter in the same position as the old letter capital
  if (isCapital) {
    newWordLetters[i] = letter.toUpperCase();
  }
}

再次加入字母后,最终世界将是tEsTing

const finalWord = newWordLetters.join("");

console.log(finalWord); // "tEsTing"

完整代码

const oldWord = "tEsT";
const newWord = "testing";

const oldWordLetters = oldWord.split("");
const newWordLetters = newWord.split("");

for (const [i, letter] of newWordLetters.entries()) {
  const oldLetter = oldWordLetters[i];

  // stop iterating if oldWord is shorter (not enough letters to copy case).
  if (!oldLetter) {
    break;
  }

  const isCapital = oldLetter === oldLetter.toUpperCase();

  // make the new letter in the same position as the old letter capital
  if (isCapital) {
    newWordLetters[i] = letter.toUpperCase();
  }
}

const finalWord = newWordLetters.join("");

console.log(finalWord);

答案 5 :(得分:0)

扩展Ryan O'Hara的答案,以下解决方案避免使用charCodes以及使用它们时可能遇到的问题。当字符串长度不同时,它还可确保更换完成。

instance Functor ((->) r) where
    fmap = (.)

答案 6 :(得分:0)

这是一个replaceCase函数:

  1. 我们将输入模式转换为正则表达式
  2. 我们有一个嵌套的替换函数,可迭代每个字符
  3. 我们使用正则表达式/[A-Z]/来识别大写字母,否则我们假设所有内容都是小写

function replaceCase(str, pattern, newStr) {
  const rx = new RegExp(pattern, "ig")
  const replacer = (c, i) => c.match(/[A-Z]/) ? newStr[i].toUpperCase() : newStr[i]
  return str.replace(rx, (oldStr) => oldStr.replace(/./g, replacer) )
}

let out = replaceCase("This is my test string: AbcD", "abcd", "qwer")
console.log(out) // This is my test string: QweR
out = replaceCase("This is my test string: abCd", "abcd", "qwer")
console.log(out) // This is my test string: qwEr

答案 7 :(得分:0)

我认为这可行

function formatItem(text, searchText){
    const search = new RegExp(escapeRegExp(searchText), 'iu')
    return text?.toString().replace(search, (m) => `<b>${m}</b>`)
}

function escapeRegExp(text) {
  return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') ?? '';
}