首页 > 解决方案 > 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

预期结果

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

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

输入你的句子:你好!不正确 >>> 你好!不是一个有效的句子

意想不到的结果你好!正确>>> 你好!<<< 是一个有效的句子!

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

标签: regexruby

解决方案


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

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

这是一个符合您的测试标准的样本。但是,它不符合您的全套规则。

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

推荐阅读