【问题标题】:Replace over multiple lines with javascript replace()用 javascript replace() 替换多行
【发布时间】:2014-05-30 16:57:22
【问题描述】:

我需要一些帮助来替换 javascript 中的多行。 我读过一些关于使用标志的文章,但我不知道如何实现它们。

这是我当前的替换()

var res = str.replace(selectedText,'<b>' + selectedText + '</b>');

它适用于单行,但不适用于多行。

如果 selectedText 是:

aaa bbb

ccc

结果是:

aaa bbb

抄送

有什么建议吗?

//安布罗斯

【问题讨论】:

  • 你应该详细说明你想要什么。此外,添加更多代码可能会有所帮助,因此我们可以更准确地为您提供帮助。

标签: javascript replace flags


【解决方案1】:

如果你给replace 一个字符串作为第一个参数,只有第一个匹配被替换。要替换 all 匹配项,您必须传入正则表达式作为第一个参数,并在其上使用 g 标志。这会将所有as 替换为bs:

var str = "a a a a";
str = str.replace(/a/g, 'b');
console.log(str); // "b b b b"

因此您需要为selectedText 创建一个正则表达式。你可以通过new RegExp(selectedText, "g")

var res = str.replace(new RegExp(selectedText, "g"),'<b>' + selectedText + '</b>');

...但是如果selectedText 中有任何在正则表达式中具有特殊含义的字符,则必须转义这些字符。可悲的是,JavaScript 没有内置函数来执行此操作,但如果您四处搜索,您可以找到几个执行此操作的函数示例。 This answer on SO 也有一些选项。

如果我们使用来自this answer to that questionRegExp.escape (这有点矫枉过正,但在矫枉过正方面相当无害)

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

...然后:

var res = str.replace(new RegExp(RegExp.escape(selectedText), "g"),'<b>' + selectedText + '</b>');

【讨论】:

  • 它应该只替换第一个匹配项不是吗?当我输入 selectedText 并且基本上想要返回我的整个文本时,除了 selectedText 现在是粗体。
  • @Ambrose:啊,我误会了。换行符没有什么特别之处。如果您没有看到文本被替换,那么文本并不完全是您认为的那样。例如,如果您的文本是"aaaa bbbb\ncccc",但您要替换的字符串是"aaaa bbbb&lt;br&gt;cccc" 甚至"aaaa bbbb&lt;p&gt;cccc&lt;/p&gt;",那么它当然不会匹配并且不会更新。您听说过的标志只会影响正则表达式中特殊的^$ 标记的含义;它们在这里不相关。
  • 嗯好吧,这是有道理的。但这真的很重要,因为我基本上是用 selectedText + 次要添加替换 selectedText 吗?我不想用“aaa bbb

    ccc”替换“aaa bbb\nccc”(=selectedText)。我将其替换为“ aaa bbb\nccc (=selectedText) ”。我不是吗?

  • @Ambrose:对。我的意思是,如果您没有看到变化,那么selectedText 不在字符串中。我正在举例说明您可能如何拥有"aaaa bbbb\ncccc",但您要替换的字符串中的文本实际上是"aaaa bbbb&lt;br&gt;cccc",因此它不匹配并且没有得到更新。
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 2015-10-11
  • 2015-09-14
  • 2011-11-08
  • 1970-01-01
  • 2010-12-03
  • 2022-08-12
  • 2011-03-13
相关资源
最近更新 更多