代码之家  ›  专栏  ›  技术社区  ›  Tintin81

如何在正则表达式中强制顺序?

  •  1
  • Tintin81  · 技术社区  · 6 年前

    在我的Rails应用程序中,我有这个正则表达式:

    /\A(?:\{(?:YYYY|YY|MM|DD|N{2,6})\}|[A-Za-z_.#-])*\z/
    

    它与以下字符串匹配: {YY}{MM}{DD}{NNNN}

    有没有办法执行 {YY} , {MM} , {DD} {NN} 例如…

    {DD}{MM}{YY}{NNNN}

    …无效吗?

    为了使这更加复杂,字母、破折号和下划线也应该在这些元素之间被允许。

    所以这个字符串也应该有效:

    {YY}-{MM}-{DD}_{NNNN}

    谢谢你的帮助。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Joey Gumbo    6 年前

    要确保订单,您的regex需要确保使用订单。现在你只是在找 YY , MM 等。相反,您可以这样做:

    \A(\{YY(YY)?\}\{MM\}\{DD\}\{N{2,6}\}|[A-Za-z_.#-])*\z
    

    要允许在零件之间使用破折号或下划线,现在可以轻松地添加它们:

    \A(\{YY(YY)?\}[-_A-Za-z]*\{MM\}[-_A-Za-z]*\{DD\}[-_A-Za-z]*\{N{2,6}\}|[A-Za-z_.#-])*\z
    
        2
  •  1
  •   revo shanwije    6 年前

    目前,您的regex匹配任何字母序列,即 abcde . 此外,你需要让一个角色 [A-Za-z_.#-] 设置为驻留在大括号之间-可选。在ruby>=1.9下,使用调用子例程调用的regex运行良好:

    \A{YY(?:YY)?}([A-Za-z_.#-]?){MM}\g<1>{DD}\g<1>{N{2,6}}\z
    

    Live demo