[英]Javascript regex invalid range in character class
我正在使用从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 Engine
,将Engine
下拉列表更改为Javascript
。
放置-
在字符类的结尾或开头 或使用两个反斜杠在字符串中进行正则表达式转义
因为你正在使用字符串,你需要为每个特殊字符使用两个反斜杠 。
注意
在SO上查看这个答案,它解释了何时使用单反斜杠或双反斜杠来逃避特殊字符
这里没有理由使用RegExp
构造函数。 只需使用RegExp
文字:
var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;
^ ^ ^ ^ ^
在RegExp
文字内部,您只需自然地编写正则表达式,除了/
,现在需要转义,因为/
在RegExp
文字中用作分隔符。
在字符类中, ^
在字符类的开头有特殊含义, -
在2个字符之间有特殊含义, \\
具有特殊含义,即逃避其他字符(主要是^
, -
, [
, ]
和\\
)和还要指定速记字符类( \\d
, \\s
, \\w
,...)。 [
, ]
用作字符类的分隔符,因此它们也有特殊含义。 (实际上,在JavaScript中,只有]
具有特殊含义,您可以指定[
不转义字符内部类型)。 除了上面列出的那5个字符之外,其他字符(除非涉及带\\
的转义序列)没有任何特殊含义。
您可以使用上述信息减少转义\\
的数量。 对于^
,除非它是字符类中的唯一字符,否则可以将其放在字符类的开头。 对于-
,您可以将它放在字符类的末尾。
var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;
改变了什么:
[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]
[\w`~!$=;+.^()|{}\[\]-]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.