ruby regex для проверки правильности предложения - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю базовую проверку предложений, которая берет строку и определяет, является ли она действительной или нет, используя следующие правила

  1. Предложение должно начинаться с правильной заглавной буквы, за которой следует строчная буква
  2. Все остальные символы должны состоять из строчных букв
  3. Между каждым словом должен быть один пробел
  4. Предложение должно заканчиваться конечной отметкой. или же ? или!

Я пробовал следующий код - который охватывает 1, 4. Но 2 работает только после первого символа

puts "Enter your sentence: " 
sentence = gets.chomp

    if (sentence =~ /^[A-Z][a-z0-9_.]\s/ && sentence.end_with?('.','?','!')) 
        puts "Correct >>> " + sentence + " <<< Is a valid sentence!"
    else 
        puts "Incorrect >>>  " + sentence + " Is NOT a valid sentence "
    end

Ожидаемый результат

Введите предложение: Здравствуйте! Правильно >>> Здравствуйте! <<< Это правильное предложение! </p>

Введите предложение: Здравствуйте! Неверно >>> привет! НЕ является действительным предложением

Введите предложение: HHello! Неправильно >>> Привет! НЕ является действительным предложением

неожиданный результат Здравствуйте! Правильно >>> HeLlo! <<< Это правильное предложение! </p>

Для одного пробела между каждым словом, используя \ s, но допускается более одного пробела

1 Ответ

0 голосов
/ 10 апреля 2019

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

Вам нужно что-то, что учитывает несколько значений после первого, которые соответствуют вашим критериям. Вы можете использовать + для этого

Вот образец, который соответствует вашим критериям теста. Однако он не соответствует вашему полному набору правил.

def sentence?(sentence)
  sentence = sentence.strip

  if sentence =~ /^[A-Z][a-z0-9_. ]+[\.?!]$/
    puts "  Correct >>> " + sentence + " <<< Is a valid sentence!"
  else
    puts "INCORRECT >>> " + sentence + " Is NOT a valid sentence "
  end
end

sentence?('Hello!') # valid
sentence?('hello!') # not valid
sentence?('HHello!') # not valid
sentence?('HeLlo!') # not valid

Вы можете использовать rubular , чтобы увидеть, как регулярное выражение захватывает различные предложения / фразы

Вот что-то, что соответствует критериям, которые вы описали

def real_sentence?(sentence)
  sentence = sentence.strip

  if sentence =~ /^[A-Z][a-z]+(\s[a-z]+){0,}[?!\.]$/
    puts "  Correct >>> " + sentence + " <<< Is a valid sentence!"
  else
    puts "INCORRECT >>> " + sentence + " Is NOT a valid sentence "
  end
end

real_sentence?('Hello how are you John?!') # not valid
real_sentence?('hello how are you?') # not valid
real_sentence?('Hello!') # valid
real_sentence?('Hello how are you?') # valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...