为什么/}/在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)像往常一样已经涵盖了这一点。不过你需要实际引用来源。如中所示,在你的答案中链接到它。