2016-10-28 3 views
-1

Я знаю, что этот вопрос задан очень часто, но мне нужен RegEx для проверки имени.Regex for name in Ruby

Единственные требования - буквы в порядке, без номеров и никаких специальных символов, отличных от 2, и пробелы не могут быть в начале или в конце, допускаются также «-» и «` ». Все остальное будет недействительным.

Все остальные ответы, похоже, требуют гораздо большего и кажутся слишком сложными.

В настоящее время я использую

/^([^\d\W]|[-])*$/ 

Но это не удается с пространством

Образец данных:

Pass:

Susan Johnson, 
Stephanie Le'Sean, 
John Pierre'-Frank 

FAIL:

Ricky2Good, 
Jean,stewie, 
[email protected], 
Jim. McNeil 
+1

Прочитайте "[mcve]". Нам нужно больше данных. Укажите имена образцов и ожидаемый результат. Без этого мы вынуждены пытаться интерпретировать ваш пример и строить на основе этого образцы данных, тратя свое время и увеличивая вероятность ответов, которые не отвечают вашим потребностям. –

+1

@thetinman Извините, что не было никакого неуважения – SupremeA

+2

Вы имеете в виду '' 'вместо' \ ''? Это также очень [наивный подход к пониманию имен] (https: //www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names /), так как акценты не только распространены, но и другие символы разрешены. Люди с именами, такими как [FM-2030] (https://en.wikipedia.org/wiki/FM-2030), существуют. – tadman

ответ

2

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

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 
+0

Итак, я пытаюсь решить ваше решение, но, похоже, оно ничего не захватывает, когда я подключаю его к http://regexr.com/. Я благодарю вас за объяснение каждой части, но, похоже, она не записывает имя при использовании? – SupremeA

+0

Не понимаю. Регулярное выражение, которое вы указали в ссылке в своем комментарии, не является тем, которое я предложил. Вы пытались запустить мой код в IRB? –

+0

Я только что разместил сайт, который я использовал ранее. Я подключил ваше регулярное выражение '' '' \ A (?: [# {STR}] + | [# {STR}] + \ s [# {STR}] +) \ z'''', и он не говорит о совпадении , Поэтому я думаю, что он не работает – SupremeA

0

Следующие регулярные выражения должны фильтровать письма, без специальных символов (кроме одного пространства, тир и обратных кавычек), и нет числа:

/^[a-zA-Z\-\`]++(?: [a-zA-Z\-\`]++)?$/ 

Надеется, что это помогает!

+0

Спасибо за это, я попробую, как только вернусь к компьютеру, но мой босс считает, что он должен допускать два пробела. Можете ли вы изменить его, чтобы разрешить два пробела. – SupremeA

+4

Измените критерии в вопросе, а не комментарии. Добавление дополнительной информации в комментарии заставляет людей пытаться прочитать каждый комментарий и попытаться привести их в порядок. –

+0

Не работает, отображается как ошибка с «++» – SupremeA