Regex для проверки критериев для имени класса - PullRequest
0 голосов
/ 30 ноября 2018

Я строю регулярное выражение, чтобы проверить, соответствует ли строка критерию имени класса ruby, другими словами, это должен быть верблюд.Первый символ должен быть заглавной буквой, а все последующие символы могут быть строчными буквами или цифрами.Это может повторяться, например SomeRandomClass.

Ниже я использую класс символов для соответствия одной букве.Затем другой класс символов, чтобы соответствовать любой букве или цифре один или несколько раз.

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

Но у классов Ruby может быть только заглавная буква без каких-либо последующих строчных букв или цифр, и поэтому я пытаюсь сделать второй класс символов необязательным с ?:, но, похоже, он не работает:

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

Что я делаю не так?

1 Ответ

0 голосов
/ 30 ноября 2018

Полагаю, вам нужно следующее.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...