{ }codelper
替换字符串P0055

全部查找替换

第一行给出文本 text,第二行给出要查找的词 a,第三行给出替换成的词 b。
输出把 text 中所有 a 都替换成 b 后的文本。
在原来的 text 中从左往右查找,已经替换过的部分不再查找。
因此在 "aaa" 中把 "aa" 换成 "b" 得到 "ba",在 "banana" 中把 "a" 换成 "aa" 得到 "baanaanaa"。
a 和 b 中的符号(.
$ ( \ 等)没有特殊含义,就是字符本身。
如果没有 a,原样输出 text。

输入
text 由包括空格(首尾没有空格)和符号在内的 ASCII 字符(32 到 126)组成,长度 1 到 1,000。
a 和 b 是不含空格的 ASCII 字符,长度 1 到 10
输出
一行,替换后的文本
样例 1 · stdin
I like cats. cats are cute.
cats
dogs
stdout
I like dogs. dogs are cute.
样例 2 · stdin
a.b.c
.
$$
stdout
a$$b$$c
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

"全部、按字面"替换的函数:Python text.replace(a, b),Java text.replace(a, b),C# text.Replace(a, b)(序数比较),Craykon text.替换(a, b)。
陷阱集中在 JS 和 Java。
① JS/TS 的 text.replace("cats", "dogs") 传字符串时只替换第一个。
② 全部替换的 replaceAll(a, b) 也会把替换词里的 $&(匹配到的词)、$$(一个美元符号)当作特殊模式,"$$" 会缩成 "$"。
要按字面替换,用 text.split(a).join(b) 或传函数 () => b。
③ Java 的 replaceAll 名不副实,第一个参数按正则表达式解析:. 匹配任意字符,( 抛出 PatternSyntaxException,替换词中的 $1 是分组引用错误。
普通的全部替换是 replace。
C 和 C++ 没有替换函数,要用 strstr/find 查找,拼上前面的部分和 b,再从匹配处之后继续查找。
如果在替换后的结果里从头重新找,当替换词包含查找词时(如 "banana" 中 a → aa)就永远不会结束。

Pythonmain.py · 4 行
text = input()a = input()b = input()print(text.replace(a, b))
JavaScriptmain.js · 3 行
const [text, a, b] = require("fs").readFileSync(0, "utf8").split("\n").map((x) => x.replace(/\r$/, ""));// split/join은 글자를 그대로 쓴다(replaceAll의 둘째 값은 $& $$ 같은 특수 패턴을 해석한다)console.log(text.split(a).join(b));
TypeScriptmain.ts · 4 行
import { readFileSync } from "node:fs";const [text, a, b]: string[] = readFileSync(0, "utf8").split("\n").map((x) => x.replace(/\r$/, ""));// split/join은 글자를 그대로 쓴다(replaceAll의 둘째 값은 $& $$ 같은 특수 패턴을 해석한다)console.log(text.split(a).join(b));
JavaMain.java · 13 行
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        String text = br.readLine();        String a = br.readLine();        String b = br.readLine();        // replace(CharSequence, CharSequence)는 글자 그대로, 모두 바꾼다(replaceAll은 정규식)        System.out.println(text.replace(a, b));    }}
C#Main.cs · 12 行
using System; class Program{    static void Main()    {        string text = Console.ReadLine();        string a = Console.ReadLine();        string b = Console.ReadLine();        Console.WriteLine(text.Replace(a, b));    }}
C++main.cpp · 18 行
#include <iostream>#include <string> int main() {    std::string text, a, b;    std::getline(std::cin, text);    std::getline(std::cin, a);    std::getline(std::cin, b);    std::string out;    size_t from = 0;    for (size_t at = text.find(a); at != std::string::npos; at = text.find(a, from)) {        out.append(text, from, at - from);        out += b;        from = at + a.size();    }    out.append(text, from, std::string::npos);    std::cout << out << "\n";}
Cmain.c · 23 行
#include <stdio.h>#include <string.h> static void read_line(char *buf, int size) {    if (!fgets(buf, size, stdin)) buf[0] = '\0';    buf[strcspn(buf, "\r\n")] = '\0';} int main(void) {    char text[1005], a[16], b[16];    read_line(text, sizeof text);    read_line(a, sizeof a);    read_line(b, sizeof b);    size_t m = strlen(a);    const char *p = text;    for (const char *q = strstr(p, a); q != NULL; q = strstr(p, a)) {        fwrite(p, 1, (size_t)(q - p), stdout);  /* 찾은 곳 앞까지 */        fputs(b, stdout);        p = q + m;                              /* 찾은 말 다음부터 다시 */    }    puts(p);    return 0;}
Craykonmain.cray · 4 行
text = 控制台.读行();a = 控制台.读行();b = 控制台.读行();控制台.输出(text.替换(a, b));