12

我正在使用从 regexlib 获得的正则表达式模式来验证相对 url。在他们的网站上,您可以测试该模式以确保它符合您的需求。一切都在他们的网站上运行良好,只要我使用我的模式,我就会收到错误消息:

字符类中的范围无效

我知道这个错误通常意味着连字符被错误地用于表示范围并且没有正确转义。但在这种情况下,因为它可以在他们的网站上运行,我很困惑为什么它不能在我的网站上运行。

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g');

注意: 如果您要从他们的网站(使用上面的链接)测试正则表达式,请务必将下拉Regex Engine菜单更改为.Client-side EngineEngineJavascript

4

2 回答 2

21

要么放在字符类-末尾开头,要么使用 两个反斜杠字符串中进行正则表达式转义

由于您使用的是字符串,因此您需要为每个特殊字符使用两个反斜杠..


笔记

在 SO 上查看这个答案,它解释了何时使用单反斜杠或双反斜杠来转义特殊字符

于 2013-05-15T18:14:00.900 回答
4

这里没有理由使用RegExp构造函数。只需使用RegExp文字:

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;
               ^           ^   ^                                                               ^                                                                                     ^

RegExp文字内部,您只需自然地编写正则表达式,除了/,现在需要转义,因为在文字/中用作分隔符。RegExp

在字符类中,在字符类^开头-有特殊含义,在两个字符之间有特殊含义,并且\有特殊含义,即转义其他字符(主要是^、、、-和)[,也可以指定简写字符类(、、, , ...)。,用作字符类的分隔符,因此它们也具有特殊含义。(实际上,在 JavaScript 中,只有特殊含义,可以在字符类中指定而不转义)。除了上面列出的 5 个字符之外,其他字符(除非涉及带有 的转义序列)没有任何特殊含义。]\\d\s\w[]][\

\您可以使用上述信息减少转义次数。对于^,除非它是字符类中唯一的字符,否则可以将其远离字符类的开头。对于-,您可以将其放在字符类的末尾。

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;

改变了什么:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]
[\w`~!$=;+.^()|{}\[\]-]
于 2013-05-15T18:43:39.650 回答