正则表达式测试类名称的条件

时间:2018-11-30 00:16:20

标签: ruby regex

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

下面,我使用字符类来匹配单个字母。然后是另一个字符类,以匹配任何字母或数字一次或多次。

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

但是Ruby类只能有一个大写字母而没有任何后续的小写字母或数字,因此我尝试使第二个字符类与?:成为可选,但似乎不起作用:

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

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

我相信您想要以下内容。

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'

很好奇的是,虽然常量名称可能包含Unicode字母,但它们必须以26个英语字母之一A-Z开头。无论如何,这是通过Ruby MRI 2.5.x实现的。但是,Ruby MRI v2.6(将于2018年12月25日发布)中的一项更改是,常量可以以大约1,853个其他字符(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是局部变量的名称:Être = 7; binding.local_variable_get(:Être) #=> 7