我正在使用从regexlib获取的正则表达式模式来验证相对URL。在他们的网站上,您可以test模式以确保它符合您的需求。一切都在他们的网站上运行良好,一旦我使用我的模式,我收到错误消息:
字符类的范围无效
我知道这个错误通常意味着连字符被错误地用于表示范围并且未正确转义。但在这种情况下,因为它在他们的网站上工作,我很困惑,为什么它不适用于我的。
var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g');
注意:
如果您要从其网站测试正则表达式(使用上面的链接),请务必将Regex Engine
下拉列表更改为Client-side Engine
,将Engine
下拉列表更改为Javascript
。
答案 0 :(得分:14)
将-
放在的结尾或开头 或使用两个反斜杠在字符串
因为你正在使用字符串,所以你需要为每个特殊字符使用两个反斜杠。
注意强>
查看关于SO的this答案,说明何时使用单反斜杠或双反斜杠来转义特殊字符
答案 1 :(得分:4)
这里没有理由使用RegExp
构造函数。只需使用RegExp
文字:
var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;
^ ^ ^ ^ ^
在RegExp
字面内,您只需自然地编写正则表达式,但/
除外,现在需要转义,因为/
用作RegExp
字面值中的分隔符。
在字符类中,^
在字符类的开头有特殊含义,-
在2个字符之间有特殊含义,\
具有特殊含义,即逃避其他字符(主要是^
,-
,[
,]
和\
)以及指定速记字符类(\d
,{{ 1}},\s
,...)。 \w
,[
用作字符类的分隔符,因此它们也具有特殊含义。 (实际上,在JavaScript中,只有]
具有特殊含义,您可以指定]
而不转义字符类内部)。除了上面列出的那5个字符外,其他字符(除非涉及[
的转义序列)没有任何特殊含义。
您可以使用上述信息减少转义\
的次数。对于\
,除非它是字符类中唯一的字符,否则可以将它放在字符类的开头。对于^
,您可以将其放在角色类的末尾。
-
改变了什么:
var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;