Я предположил, что для того, чтобы строка была действительной, она может содержать только прописные и строчные буквы, апострофы, тире и не более двух пространств, при условии, что пробелы не находятся в начале или конце строки.
STR= "-a-z'"
r =/
\A # match beginning of string
(?: # begin non-capture group
[#{STR}]+ # match 1+ letters, "-" or "'"
| # or
[#{STR}]+\s[#{STR}]*\s?[#{STR}]+
# match 1+ letters, "-" or "'", space, 0+ letters, "-" or "'",
# optional space, 1+ letters, "-" or "'"
) # end non-capture group
\z # match end of string
/ix # case-indifferent and free-spacing regex definition modes
#=>/
\A # match beginning of string
(?: # begin non-capture group
[-a-z']+ # match 1+ letters, "-" or "'"
| # or
[-a-z']+\s[-a-z']*\s?[-a-z']+
# match 1+ letters, "-" or "'", space, 0+ letters, "-" or "'",
# optional space, 1+ letters, "-" or "'"
) # end non-capture group
\z # match end of string
/ix
Если я не использовал режим свободного Разнос определить регулярное выражение, оно будет выглядеть следующим образом:
r = /\A(?:[-a-z']+|[-a-z']+\s[-a-z']*\s?[-a-z']+)\z/i
"a B-' v" =~ r #=> 0
"aB-'v" =~ r #=> 0
"aB-'1v" =~ r #=> nil
"a B-'1 v" =~ r #=> nil
" a B-1v" =~ r #=> nil
Если вы хотите вернуть true
или false
, а не truthy значения 0
или его falsy значение nil
, вы могли бы написать, например:
("a B-' v" =~ r) ? true : false #=> true
или ("трюк")
!!("a B-' v" =~ r) #=> true
Последние работы, потому что это то же самое, как:
!(!("a B-' v" =~ r))
#=> !(!(0)) => !(false) => true
Вопрос просит регулярное выражение для проверки имен. Использование регулярного выражения может быть лучшим, но это не единственный способ. Если вопрос действительно заключается в том, как проверять имена - используя регулярное выражение или иначе - это должно быть указано таким образом, чтобы не оговаривать конкретный подход. Вот один из способов проверки без использования регулярного выражения.
GOOD_CHARS = ('a'..'z').to_a.join << "'-"
#=> "abcdefghijklmnopqrstuvwxyz'-"
def validate(str)
return false if str.empty? || (str[0]==' ' || str[-1]==' ')
nbr_spaces = str.count(' ')
return false if nbr_spaces > 2
str.downcase.count(GOOD_CHARS) + nbr_spaces == str.size
end
validate "a B-' v" #=> true
validate "aB-'v" #=> true
validate "aB-`1v" #=> false
validate "a B-'1 v" #=> false
validate " a B-'1v" #=> false
Прочитайте "[mcve]". Нам нужно больше данных. Укажите имена образцов и ожидаемый результат. Без этого мы вынуждены пытаться интерпретировать ваш пример и строить на основе этого образцы данных, тратя свое время и увеличивая вероятность ответов, которые не отвечают вашим потребностям. –
@thetinman Извините, что не было никакого неуважения – SupremeA
Вы имеете в виду '' 'вместо' \ ''? Это также очень [наивный подход к пониманию имен] (https: //www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names /), так как акценты не только распространены, но и другие символы разрешены. Люди с именами, такими как [FM-2030] (https://en.wikipedia.org/wiki/FM-2030), существуют. – tadman