【问题标题】:ruby regex to check for a valid sentenceruby 正则表达式来检查一个有效的句子
【发布时间】:2019-08-31 17:51:08
【问题描述】:

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

  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 但它允许多个空格

【问题讨论】:

  • 你认为什么是“词”?我看到你添加了一个点和一个下划线。如果您认为单词是小写字母块,请尝试/\A\p{Lu}\p{Ll}*(?:\s\p{Ll}+)*[.?!]\z/
  • 是的,所以所有其他字符必须是小写字母、分隔符(, ; :) 或终端标记(, ? !)
  • 你能澄清一下吗?你想在空格之前允许任何标点符号(但最后的)吗? /\A\p{Lu}\p{Ll}*(?:[\p{P}&amp;&amp;[^?!.]]?\s\p{Ll}+)*[.?!]\z/?见rubular.com/r/MlD0EZI5w8ak6C
  • 我上面的正则表达式是否按预期工作?如果您只需要支持,、; 或:,请将[\p{P}&amp;&amp;[^?!.]] 替换为[,;:]。见rubular.com/r/MkfFz5uvnGhYY7
  • \p{Lu} - 大写字母,\p{Ll} - 小写字母。

标签: regex ruby


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

【讨论】:

  • 我不知道为什么我投了反对票,但如果有人想插话并提供解释,那就太好了。我的原始答案没有包含完整的解决方案,因为 OP 的标准和正则表达式不匹配(正则表达式允许整数和下划线,但只表示字母)。对我来说很明显这是一个学习练习,他们并没有尝试用有限的正则表达式解析句子。因此,我并没有试图超越这个问题,只是在正确的方向上提供足够的推动,而不是用更复杂的正则表达式解决方案来解决未说明的标准
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 2013-04-29
  • 1970-01-01
  • 2016-12-16
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多