【问题标题】:Javascript regex invalid range in character class字符类中的 Javascript 正则表达式无效范围
【发布时间】:2013-05-15 18:09:40
【问题描述】:

我正在使用从 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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    - 放在字符类的结束开始使用两个反斜杠string

    中进行正则表达式转义

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


    注意

    查看 SO 上的 this 答案,其中解释了何时使用单反斜杠或双反斜杠来转义特殊字符

    【讨论】:

    • 我在两个字符类中都将它移到了末尾,但现在我得到了Invalid quantifier
    • 我不能同时将连字符 ie(\\-) 转义而不是移到末尾吗?
    • @bflemi3 是的,你确实可以逃脱它..查看我在 ans 中指定的链接
    • @bflemi3 因为您使用的是字符串,所以您需要为每个转义序列使用 两个反斜杠..这样可以解决您的问题..
    • 刚刚弄清楚并回答了我自己的问题。我会删除它并给你信用。感谢您的帮助:)
    【解决方案2】:

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

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

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

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

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

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

    改变了什么:

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

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2014-11-23
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多