在放入 RegEx 之前应该转义的所有字符的列表?

IT技术 javascript regex escaping
2021-02-03 09:17:30

有人可以提供应该转义的特殊字符的完整列表吗?

我怕我不认识他们中的一些人。

6个回答

看看 PHP.JS 对 PHPpreg_quote函数的实现,它应该可以满足您的需求:

http://phpjs.org/functions/preg_quote:491

特殊的正​​则表达式字符是: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

如果你用 str_replace 来转义这些,你应该先转义 \。在上面的列表中,如果一个 . 替换为\.,\。然后将被替换为 \\.,这不是我们想要的。
2021-04-09 09:17:30

根据这个站点,要转义的字符列表是

[、反斜杠 \、插入符号 ^、美元符号 $、句点或点 .、竖线或竖线符号 |、问号 ?、星号或星号 *、加号 +、开始的圆括号 (和结束圆括号)。

除此之外,您需要转义由 Javascript 解释器解释为字符串结尾的字符,即'"

不知道如何制作该网站。它涵盖了 RegEx 的多种风格,但没有指定此列表适用于哪些类型。
2021-03-29 09:17:30

基于 Tatu Ulmanen 的回答,我在 C# 中的解决方案采用了以下形式:

private static List<string> RegexSpecialCharacters = new List<string>
{
    "\\",
    ".",
    "+",
    "*",
    "?",
    "[",
    "^",
    "]",
    "$",
    "(",
    ")",
    "{",
    "}",
    "=",
    "!",
    "<",
    ">",
    "|",
    ":",
    "-"
};


foreach (var rgxSpecialChar in RegexSpecialCharacters)
                rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);

请注意,我已经切换了 '\' 和 '.' 的位置,如果不先处理斜杠,则会导致 '\' 的加倍

编辑

这是一个javascript翻译

var regexSpecialCharacters = [
    "\\", ".", "+", "*", "?",
    "[", "^", "]", "$", "(",
    ")", "{", "}", "=", "!",
    "<", ">", "|", ":", "-"
];

regexSpecialCharacters.forEach(rgxSpecChar => 
    input = input.replace(new RegExp("\\" + rgxSpecChar,"gm"), "\\" + 
rgxSpecChar))
OP 没有要求 JS 吗?
2021-03-20 09:17:30
@JamieHutber 他们做到了
2021-03-21 09:17:30
解释一下 :D 他们后来编辑了他们的标签
2021-04-04 09:17:30

在字符集中,要匹配文字 hyphen -,它需要在未定位在开头或结尾时进行转义。例如,给定以下模式中最后一个连字符的位置,需要对其进行转义:

[a-z0-9\-_]+

但是这里不需要转义:

[a-z0-9_-]+

如果连字符转义失败,引擎将尝试将其解释为前一个字符和下一个字符之间的范围(就像a-z匹配 a 和 z 之间的任何字符一样)。

此外,/s 不会在字符集内转义(尽管在字符集外时它们确实需要转义)。因此,以下语法是有效的;

const pattern = /[/]/;

我正在寻找有关 ESLint 为 reg-ex 设置的“no-useless-escape”设置的列表。并发现其中一些提到的字符不需要为 JS 中的正则表达式进行转义。此处另一个答案中较长的列表适用于 PHP,它确实需要对附加字符进行转义。

这个 ESLint 的 github 问题中,大约一半,用户not-an-aardvark解释了为什么问题中引用的字符是一个应该被转义的字符。

在 javascript 中,需要转义的字符语法字符,或以下之一:

^ $ \ . * + ? ( ) [ ] { } |

对我上面链接的 github 问题的响应包括对“Annex B”语义(我不太了解)的解释,它允许对上述字符中的 4 个进行非转义: ) ] { }.

另一件要注意的事情是,转义不需要转义的字符不会造成任何伤害(除非您试图转义转义字符)。所以,我个人的经验法则是:“有疑问时,逃避”

“转义不需要转义的字符不会造成任何伤害”不幸的是,这不再是真的,至少<input pattern="">在 Firefox 中是这样: stackoverflow.com/questions/36953775/...
2021-04-12 09:17:30