在JavaScript中使用正则表达式进行搜索和替换

4

我有一个正则表达式,在notepad++中用于搜索和替换以操纵一些文本,现在想把它加入到我的javascript代码中。这是该正则表达式:

搜索(?-s)(.{150,250}\.(\[\d+\])*)\h+ 并用\1\r\n\x20\x20\x20替换。

实际上每150-250个单词创建新的段落并进行缩进。

这是我在JavaScript中尝试过的方法。对于HTML中的文本框<textarea name="textarea1" id="textarea1"></textarea>,我使用了以下JavaScript代码:

function rep1() {
    var re1 = new RegExp('(?-s)(.{150,250}\.(\[\d+\])*)\h+');
    var re2 = new RegExp('\1\r\n\x20\x20\x20');
    var s = document.getElementById("textarea1").value;
    s = string.replace(re1, re2);
    document.getElementById("textarea1").value = s;
}

我也尝试直接将正则表达式作为string.replace()的参数,但这也不起作用。有没有什么想法,我做错了什么?


(?-s)在JS引擎中无效 在此测试 - Code Maniac
你的函数在哪里执行? - Quentin Veron
1个回答

2
几个问题:
  • JavaScript不支持(?-s)。您需要单独添加修饰符。但是,在JavaScript中,这是默认设置,因此您可以将其留空。如果您的意图是让.也匹配换行符,则在JavaScript正则表达式中使用[^]而不是.
  • JavaScript不支持\h——水平空格。相反,您可以使用[^\S\r\n]
  • 当将字符串字面量传递给new RegExp时,请注意反斜杠是字符串字面量表示法的转义字符,因此它们不会出现在正则表达式中。因此,要么将它们加倍,要么使用JavaScript的正则表达式字面值表示法。

  • 在JavaScript中,replace只会替换第一个出现,除非您为正则表达式提供了g修饰符。

  • 替换(作为replace的第二个参数)不应该是正则表达式。它应该是一个字符串,因此不要对其应用new RegExp

  • 替换字符串中的反向引用应采用$1格式。JavaScript不支持在此处使用\1
  • 您引用了string,但实际上您想引用的是s

这应该可以工作:

function rep1() {
    var re1 = /(.{150,250}\.(\[\d+\])*)[^\S\r\n]+/g;
    var re2 = '$1\r\n\x20\x20\x20';
    var s = document.getElementById("textarea1").value;
    s = s.replace(re1, re2);
    document.getElementById("textarea1").value = s;
}

非常棒的答案,如果我自己写的话可能要花很长时间,所以非常感谢您抽出时间来做这件事,非常感激! - Floran Thovan
啊,你说得对,@WiktorStribiżew。已经更新了! - trincot

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