11 KiB
11 KiB
title | localeTitle |
---|---|
Search and Replace | 搜索和替换 |
如果卡住,请记得使用**Read-Search-Ask
** 。尝试配对程序并编写自己的代码
问题说明:
您将创建一个程序,它接受一个句子,然后在其中搜索一个单词并将其替换为新单词,同时保留大写(如果有的话)。
相关链接
提示:1
- 找到字符串中
before
的索引。
现在尝试解决问题
提示:2
- 检查首字母案例。
现在尝试解决问题
提示:3
- 字符串是不可变的,您需要将编辑保存在另一个变量上,即使您必须重复使用相同的变量,只是为了使它看起来像只使用那个变量完成的更改。
现在尝试解决问题
扰流警报!
提前解决!
基本代码解决方案
function myReplace(str, before, after) {
// Find index where before is on string
var index = str.indexOf(before);
// Check to see if the first letter is uppercase or not
if (str[index] === str[index].toUpperCase()) {
// Change the after word to be capitalized before we use it.
after = after.charAt(0).toUpperCase() + after.slice(1);
}
// Now replace the original str with the edited one.
str = str.replace(before, after);
return str;
}
// test here
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
代码说明:
- 使用
indexOf()
在字符串中查找before的位置。 - 如果之前的第一个字母大写,则将后面的第一个字母更改为大写。
- 之前在字符串中替换为after 。
- 返回新字符串。
相关链接
- JS String Prototype IndexOf
- JS String Prototype ToUpperCase
- JS String Prototype CharAt
- JS String Prototype Slice
中级代码解决方案:
function myReplace(str, before, after) {
//Create a regular expression object
var re = new RegExp(before,"gi");
//Check whether the first letter is uppercase or not
if(/[AZ]/.test(before[0])){
//Change the word to be capitalized
after = after.charAt(0).toUpperCase()+after.slice(1);
}
//Replace the original word with new one
var newStr = str.replace(re,after);
return newStr;
}
// test here
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
代码说明:
- 在此解决方案中,正则表达式
[AZ]
用于检查字符是否为大写。 - 创建一个新的正则表达式对象, re 。
- 如果before的首字母大写,则将after的第一个字母更改为大写。
- 在字符串之前替换之后 。
- 返回新字符串。
相关链接
- JS Regex资源
高级代码解决方案
function myReplace(str, before, after) {
// create a function that will change the casing of any number of letter in parameter "target"
// matching parameter "source"
function applyCasing(source, target) {
// split the source and target strings to array of letters
var targetArr = target.split("");
var sourceArr = source.split("");
// iterate through all the items of sourceArr and targetArr arrays till loop hits the end of shortest array
for (var i = 0; i < Math.min(targetArr.length, sourceArr.length); i++){
// find out the casing of every letter from sourceArr using regular expression
// if sourceArr[i] is upper case then convert targetArr[i] to upper case
if (/[AZ]/.test(sourceArr[i])) {
targetArr[i] = targetArr[i].toUpperCase();
}
// if sourceArr[i] is not upper case then convert targetArr[i] to lower case
else targetArr[i] = targetArr[i].toLowerCase();
}
// join modified targetArr to string and return
return (targetArr.join(""));
}
// replace "before" with "after" with "before"-casing
return str.replace(before, applyCasing(before, after));
}
// test here
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
代码说明:
- before和after都作为
applyCasing()
参数传递。 - 功能
applyCasing()
在使用前以改变各个字符的情况下,在targetArr即,按照在sourceArr即字符之后 。 replace()
用于替换之前和之后 ,其外壳与之前相同。
高级代码解决方案
// Add new method to the String object, not overriding it if one exists already
String.prototype.capitalize = String.prototype.capitalize ||
function() {
return this[0].toUpperCase() + this.slice(1);
};
const Util = (function () {
// Create utility module to hold helper functions
function textCase(str, tCase) {
// Depending if the tCase argument is passed we either set the case of the
// given string or we get it.
// Those functions can be expanded for other text cases.
if(tCase) {
return setCase(str, tCase);
} else {
return getCase(str);
}
function setCase(str, tCase) {
switch(tCase) {
case "uppercase": return str.toUpperCase();
case "lowercase": return str.toLowerCase();
case "capitalized": return str.capitalize();
default: return str;
}
}
function getCase(str) {
if (str === str.toUpperCase()) { return "uppercase"; }
if (str === str.toLowerCase()) { return "lowercase"; }
if (str === str.capitalize()) { return "capitalized"; }
return "normal";
}
}
return {
textCase
};
})();
function myReplace(str, before, after) {
const { textCase } = Util;
const regex = new RegExp(before, 'gi');
const replacingStr = textCase(after, textCase(before));
return str.replace(regex, replacingStr);
}
高级代码解决方案备选2:
function myReplace(str, before, after) {
const myArr = str.split(' ');
const [wordToReplace] = myArr.filter(item => item === before);
return wordToReplace[0].toUpperCase() !== wordToReplace[0]
? myArr.map(item => item === before ? after : item).join(' ')
: myArr.map(item => item === before? after[0].toUpperCase() + after.slice(1) : item).join(' ');
}
// test:
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");
相关链接
- JS String Prototype Split
- JS for Loops解释
- JS Math Min
- string.length减
- JS String Prototype ToLowerCase
- JS Array Prototype Join
捐款说明:
- 请勿添加与任何现有解决方案类似的解决方案。如果您认为它**相似但更好** ,那么尝试合并(或替换)现有的类似解决方案。
- 添加解决方案的说明。
- 将解决方案分为以下类别之一 - 基本 , 中级和高级 。
- 如果您添加了任何**相关的主要内容,**请仅添加您的用户名。 ( 不要 删除任何现有的用户名 )