为什么/}/在javascript中是有效的正则表达式?

为什么/}/在javascript中是有效的正则表达式?,javascript,regex,Javascript,Regex,/}/是JS中的有效正则表达式: alert('}}}'.replace(/}/g, "!")) 但是,似乎不允许: PatternCharacter ::SourceCharacter but not any of: ^ $ \ . * + ? ( ) [ ] { } | 为什么上述方法有效?此功能是否得到普遍支持?它在任何地方都有文档记录吗?小更正:这些是RegExpes,与纯正则表达式不同 为什么上述方法有效 因为您正在使用的JS实现没有严格遵守ES5标准,该标准规定它应该

/}/
是JS中的有效正则表达式:

alert('}}}'.replace(/}/g, "!"))
但是,似乎不允许:

PatternCharacter ::SourceCharacter but not any of:
      ^ $ \ . * + ? ( ) [ ] { } |

为什么上述方法有效?此功能是否得到普遍支持?它在任何地方都有文档记录吗?

小更正:这些是
RegExp
es,与纯正则表达式不同

为什么上述方法有效

因为您正在使用的JS实现没有严格遵守ES5标准,该标准规定它应该引发一个
SyntaxError
。正如Bergi所评论的,这在中进行了描述

此功能是否得到普遍支持

不,如果它不在标准中,就永远不应该被认为是普遍支持的

它在任何地方都有记录吗

可能不是,这只是未定义行为的产物。查看您测试的任何JS引擎的文档。

大多数正则表达式风格将大括号{视为文本 字符,除非它是重复运算符的一部分,如{1,3} 您通常不需要用反斜杠来逃避它,但是 如果需要,可以这样做。此规则的一个例外是 java.util.regex包:它要求对所有文本大括号进行转义


似乎javascript也不例外。

可能解析器不介意]没有[-可能与}和}一样,我从来没有见过它不起作用,但这并不意味着什么。我发现有几个(大多数?)正则表达式lib允许未替换的结束delims。@Dave:它甚至可以用于开始delims:
/
它也允许
/{/
/{}/
。如果大括号内没有数字,它们将被视为文字。这是ECMA标准允许的regexp语法的扩展。@Bergi取决于实现;我指的不仅仅是JS实现。您能解释“regexps”和“纯正则表达式”?另外,你能链接到标准吗?我不知道甚至有一个。@Tomalak问题中有一个链接。它是指定的,请参阅:“如果P的字符没有语法形式模式,那么抛出一个语法错误异常”@Tomalak:我猜Regexps指的是由
RegExp
和创建的实例纯正则表达式”很可能是正则表达式literals@Tomalak这里是对差异的描述——简·戈瓦茨(Jan Goyvaerts)像往常一样已经涵盖了这一点。不过你需要实际引用来源。如中所示,在你的答案中链接到它。