如何使用JavaScript转义正则表达式特殊字符?

241

我需要使用JavaScript转义正则表达式的特殊字符。我该如何实现?感谢您提供的任何帮助。


谢谢您快速回复。但我需要转义所有正则表达式的特殊字符。我已经尝试了这段代码,但是没有得到结果。

RegExp.escape=function(str)
            {
                if (!arguments.callee.sRE) {
                    var specials = [
                        '/', '.', '*', '+', '?', '|',
                        '(', ')', '[', ']', '{', '}', '\\'
                    ];
                    arguments.callee.sRE = new RegExp(
                    '(\\' + specials.join('|\\') + ')', 'gim'
                );
                }
                return str.replace(arguments.callee.sRE, '\\$1');

            }

function regExpFind() {
            <%--var regex = new RegExp("\\[munees\\]","gim");--%>
                    var regex= new RegExp(RegExp.escape("[Munees]waran"));
                    <%--var regex=RegExp.escape`enter code here`("[Munees]waran");--%>
                    alert("Reg : "+regex);
                }

这段代码有什么错误?请指导我。


1
我在这里添加了一个答案[https://dev59.com/AXA65IYBdhLWcg3w7DT8#63838890],尽管TC39做出了不幸的决定,但实现了所提议的标准化方法。即使他们看不到标准化的价值,如果我们都能使用相同的方法,我们很可能会看到它的价值。 - Drewry Pope
3个回答

576
使用\字符来转义在正则表达式中具有特殊含义的字符。
要自动化它,你可以使用以下方法:
function escapeRegExp(text) {
  return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}

更新:现在有一个提案正在标准化这种方法,可能在ES2016中实现:https://github.com/tc39/proposal-regex-escaping 更新:上述提案被拒绝了(但是有一个2023年的重写正在进行中),所以现在请自行实现这个功能。

1
“,”有什么特别之处吗?只是好奇。 - Viliam
1
@Viliam 我不知道具体细节,但如果我没记错的话,逗号需要转义以保持与一些旧/有缺陷的JavaScript引擎的向后兼容性。 - Mathias Bynens
8
当我没有转义斜杠时,正则表达式验证器会投诉我,因此我将其添加到您最出色的模式 /[-[\]{}()*+?.,\\/^$|#\s]/g 中。 - 2Toad
14
MDN文档中也提供了一个建议的函数(搜索escapeRegExp函数),使用了正则表达式/[.*+?^${}()|[\]\\]/g和替换字符串'\\$&'。有人知道它可能存在的缺陷吗? - John McMahon
2
我在这里添加了一个答案[https://dev59.com/AXA65IYBdhLWcg3w7DT8#63838890],尽管TC39做出了不幸的决定,但实现了所提议的标准化方法。即使他们看不到标准化的价值,如果我们都能使用相同的方法,我们很可能会看到它的价值。 - Drewry Pope
显示剩余9条评论

21

使用反斜杠转义字符。例如:

/\\d/

这将匹配\d而不是数字字符


双反斜杠对我有用,谢谢。 - yussan
@Ben Rowe,您能否提供一个适用于像 US$ 这样的单词的正则表达式?我已经尝试了“\b(US$)\b”,但似乎效果不佳。 - Jeetendra Ahuja
1
@JeetendraAhuja - "$"字符不是单词字符,因此"\b(US$)\b"只会匹配后面是单词字符的情况。你可能要使用"\b(US$)\B"来表示最后一个字符不是单词边界。 - Trondster
如果在使用 RegExp 变量时,需要将 \ 转义为 \\。例如,如果您想要将 (a)bc 中的 (a) 替换为空并得到 bc,可以编写以下代码:var regex = new RegExp('\\\(a\\\)' ,"g"); str = str.replace(regex, ''); - yu yang Jian

10

使用\可以转义特殊字符

将特殊字符转义为字面量,将字面量字符转义为特殊字符。

例如:/\(s\)/ 可以匹配 '(s)',而/(\s)/ 可以匹配任何空格并捕获匹配结果。

来源:http://www.javascriptkit.com/javatutors/redev2.shtml


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