Полагаю, вам нужно следующее.
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 (выйдет 25 декабря 2018 года), заключается в том, что константы могут начинаться с 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
- это имя локальной переменной: Être = 7; binding.local_variable_get(:Être) #=> 7
.