【发布时间】:2019-08-31 17:51:08
【问题描述】:
我正在创建一个基本的句子检查器,它接受一个字符串并使用以下规则确定它是否有效
- 句子必须以有效的大写字母开头,后跟小写字母
- 所有其他字符必须是小写字母
- 每个单词之间必须有一个空格
- 句子必须以终止符结尾。要么 ?或!
我尝试了以下代码 - 涵盖 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}&&[^?!.]]?\s\p{Ll}+)*[.?!]\z/?见rubular.com/r/MlD0EZI5w8ak6C -
我上面的正则表达式是否按预期工作?如果您只需要支持
,、;或:,请将[\p{P}&&[^?!.]]替换为[,;:]。见rubular.com/r/MkfFz5uvnGhYY7 -
\p{Lu}- 大写字母,\p{Ll}- 小写字母。