代码之家  ›  专栏  ›  技术社区  ›  Daniel Viglione

用于测试类名标准的正则表达式

  •  0
  • Daniel Viglione  · 技术社区  · 7 年前

    我正在构建一个正则表达式来检查字符串是否符合ruby类名称的条件,换句话说,它必须是camelcase。第一个字符必须是大写字母,所有后续字符可以是小写字母或数字。这可能会重复,例如SomeRandomClass。

    'This' =~ /^([A-Z][a-z0-9]+)$/
     # => 0 
    

    ?: ,但它似乎不起作用:

    'ThisIsATest' =~ /^([A-Z](?:[a-z0-9]+))+$/
     # => nil 
    

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Cary Swoveland    7 年前

    我相信你想要以下。

    r = /
        \A           # match the beginning of the string
        [A-Z]        # match an upper case English letter
        \p{Alnum}*   # match zero or more Unicode letters or digits
        \z           # match the end of the string
        /x           # free-spacing regex definition mode
    
    'ThisIsATest'.match? r  #=> true
    'TIsAT22Test'.match? r  #=> true
    'thisIsATest'.match? r  #=> false
    'ThisIsATest?'.match? r #=> false
    'T'.match? r            #=> true
    'LeMêmeTest'.match? r   #=> true
    'Être'.match? r         #=> false
    ''.match? r             #=> false
    

    我们只能测试第一个字符(必须是字母)的大小写,因为剩余字母的大写和小写的任何组合都可以解释为对应于大小写名称。例如 'TIsAT22Test'.match? r #=> true 可以说 'T Is A T22 Test' 'TIsAT22test'.match? r #=> true 因为它可以被视为 'T Is A T22test' .

    A-Z . 这是通过RubyMRI 2.5.x实现的。然而,Ruby MRI v2.6(将于2018年12月25日发布)中的一个变化是常量可以以1853个额外字符开头( source ). 大概(我会调查和编辑以显示我的发现),任何角色 s 满足 s.match? /\p{Upper}/ #=> true

    1.在Ruby v2.5.1中可以看到 Même 是常量的有效名称: Même = 4; Même = 5 #=> warning: already initialized constant . 然而, Être 事实并非如此。事实上 是局部变量的名称: Être = 7; binding.local_variable_get(:Être) #=> 7