字符类中的Javascript正则表达式无效范围

字符类中的Javascript正则表达式无效范围,javascript,regex,Javascript,Regex,我正在使用从regexlib获得的regex模式来验证相对URL。在他们的网站上,你可以修改模式,以确保它符合你的需要。在他们的网站上,一切都很好,只要我使用我的模式,我就会收到错误消息: 字符类中的范围无效 我知道这个错误通常意味着一个连字符被错误地用来表示一个范围,并且没有正确地转义。但在这种情况下,因为它在他们的网站上工作,我很困惑为什么它不在我的网站上工作 var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\

我正在使用从regexlib获得的regex模式来验证相对URL。在他们的网站上,你可以修改模式,以确保它符合你的需要。在他们的网站上,一切都很好,只要我使用我的模式,我就会收到错误消息:

字符类中的范围无效

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

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g');
注意:
如果您打算从他们的站点测试正则表达式(使用上面的链接)请确保将
Regex引擎
下拉列表更改为
客户端引擎
,将
引擎
下拉列表更改为
Javascript

-
放在字符类结尾开头,或使用两个反斜杠执行Regex转义在字符串中

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


注意


请查看上面的答案,它解释了何时使用单反斜杠或双反斜杠转义特殊字符

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

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g;
               ^           ^   ^                                                               ^                                                                                     ^
RegExp
literal内部,您只需自然地编写regex,除了
/
,现在需要转义,因为
/
RegExp
literal中用作分隔符

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

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

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

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]
[\w`~!$=;+.^()|{}\[\]-]

我在两个字符类中都把它移到了末尾,但是现在我得到了
无效的量词
,我不能同时对连字符进行双转义(
\\-
)不是把它移到最后?@bflemi3是的,你确实可以逃脱它。。检查一下我在ans@bflemi3由于您使用的是字符串,所以每个转义序列都需要使用两个反斜杠。这将解决您的问题。您只需解决这个问题并回答我自己的问题。我将删除它并给您评分。谢谢您的帮助lp:)