Javascript正则表达式在字符类中无效

bfl*_*mi3 7 javascript regex

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

字符类中的范围无效

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

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

注意: 如果您要从他们的站点测试正则表达式(使用上面的链接),请确保将Regex Engine下拉列表更改为Client-side EngineEngine下拉列表Javascript.

Ani*_*dha 15

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

因为你正在使用字符串,你需要为每个特殊字符使用两个反斜杠.


注意

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


nha*_*tdh 5

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

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

在文字内部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;
Run Code Online (Sandbox Code Playgroud)

改变了什么:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]
[\w`~!$=;+.^()|{}\[\]-]
Run Code Online (Sandbox Code Playgroud)