红宝石正则表达式来检查一个有效的句子

时间:2019-04-10 09:55:45

标签: regex ruby

我正在创建一个基本的句子检查器,该检查器使用一个字符串并使用以下规则确定该字符串是否有效

  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

预期结果

输入您的句子: 你好! 正确>>>您好! <<<是有效的句子!

输入您的句子: 你好! 错误>>>您好!不是有效的句子

输入您的句子: 你好! 错误>>>您好!不是有效的句子

意外结果 你好! 正确>>> HeLlo! <<<是有效的句子!

对于每个单词之间使用\ s的单个空格,但允许多个空格

1 个答案:

答案 0 :(得分:-1)

您的正则表达式仅检查大写字母,然后立即检查小写字母/数字/下划线/任何字符,再跟一个空格。

在第一个符合您条件的值之后,您需要一些允许多个值的值。您可以为此使用+

这是符合您测试标准的样品。但是,它不符合您的全部规则。

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