在两个字符串之间查找和替换JS中的文本字符串。

3

我正在尝试在字符串中查找和替换一个单词。

示例:

let string = 
`
Title: Hello World
Authors: Michael Dan
`

我需要找到 Hello World 并替换为我想要的内容,以下是我的尝试:
const replace = string.match(new RegExp("Title:" + "(.*)" + "Authors:")).replace("Test")

当你使用 replace() 时,不需要使用 match()。可以在此处使用 string.replace(/(Title:).*(?=\nAuthors:)/gs, '$1Test') - Wiktor Stribiżew
@WiktorStribiżew 的问题在于它甚至找不到匹配。 - Fillipo
@WiktorStribiżew,您能否详细说明一下?抱歉,我没有完全理解。 - Fillipo
好的,我看到了,我可能在s标志上有误。无论如何,你需要保留第一个和最后一个单词。 - Wiktor Stribiżew
4个回答

4

当您替换一些文本时,不必显式地运行String#matchRegExp#execString#replace会在幕后自动运行。

您可以使用

let string = "\nTitle: Hello World\nAuthors: Michael Dan\n"
console.log(string.replace(/(Title:).*(?=\nAuthors:)/g, '$1 Test'));

模式匹配

  • (Title:) - 第1组:固定字符串Title:
  • .* - 匹配行的其余部分,零个或多个非换行符、CR和LF字符(我们需要消耗这个文本以删除它)
  • (?=\nAuthors:) - 正向先行断言,匹配一个位置,该位置紧随LF字符和字符串Authors:之后。

请参见正则表达式演示

如果您的字符串中可能会有CRLF行结尾,则需要将(?=\nAuthors:)替换为(?=\r?\nAuthors:)(?=(?:\r\n?|\n)Authors:)


0

你最好先转换为对象,然后只定义标题属性:

let string = 
`
Title: Hello World
Authors: Michael Dan
`

const stringLines = string.split('\n');
let stringAsObject = {};

stringLines.forEach(
  (line) => {
    if (line.includes(':')) {
      stringAsObject[line.split(':')[0]] = line.split(':')[1];
    }
  }
);

stringAsObject.Title = 'NewValue';

我无法访问“Hello World”。我需要先找到它。 - Fillipo
在这种情况下,如果您知道您的属性总是由换行符和 : 字符分隔,那么最好将其转换为键入对象,然后替换您的标题。 - Tom

0

您可以使用以下方式的replace方法:

string.replace("Hello World", "Test");

我无法访问“Hello World”,我需要先找到它。 - Fillipo
我不明白,它可以工作:https://jsfiddle.net/5gdbn6sf/2/ - patrykw
1
我是说我不能硬编码“Hello world”。我需要先找到它,然后再替换它。这个文本总是不同的。 - Fillipo

0

我可以不用正则表达式实现这个功能。你只需要知道需要查找的字符串的索引。

var original = `
Title: Hello World
Authors: Michael Dan
`;

var stringToFind = "Hello World";
var indexOf = original.indexOf(stringToFind);
original = original.replace(original.substring(indexOf, indexOf + stringToFind.length), "Hey Universe!");

console.log(original)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接