我正在通过Exercism练习学习Scala,但我被Bob练习卡住了。我在倒数第二个案例中的目标是回答哇,冷静点!如果给定的语句有大写字母,但也可以包含除问号以外的任何其他内容。我似乎找不到一种方法来实现这一点,而不与另一条规则相矛盾。我不确定isLetter是否是一个真正的函数,但我的锻炼导师建议我使用它。
object Bob {
def response(statement: String): String = {
// println(statement)
println("k".contains("abcdefghijklmnopqrstuvwxyz".toCharArray))
statement.trim() match {
case x if x.isEmpty => "Fine. Be that way!"
case x if x.matches("^[A-Z0-9][^a-z].+\\?$") => "Calm down, I know what I'm doing!"
case x if x.matches("^.+\\?$") => "Sure."
case x if (x.matches ("[A-Z %\\^*@#$(*\\!,)0-9]+") /*&& x.isLetter*/) => "Whoa, chill out!"
case _ => "Whatever."
}
}
}我遇到麻烦的测试用例:
"1, 2, 3 GO!"
"1, 2, 3"1,2,3开始!应该是谁,冷静下来。而1,2,3应该是任何值,但总是返回为哇哇冷静下来。
谢谢。
发布于 2021-08-05 06:00:02
从有限的解释来看,我认为“哇……”case应该检查两个条件,
任何地方都不能出现至少1个资本letter.
如果这些是你的要求,那么你的“哇……”case可以简单地写成这两个条件的AND。
case x if (x.matches("(.*)([A-Z]+)(.*)") && !x.matches("(.*)(\\?)(.*)")) => "Whoa, chill out!"发布于 2021-08-05 08:51:59
您可以使用单个模式,并通过正向先行断言char A-Z,然后匹配除问号以外的任何字符。
^(?=[^A-Z]*[A-Z\n])[^?\n]+$说明
^ string(?=正向先行的开始,断言右侧是[^A-Z\n]*[A-Z]匹配除换行符或A-Z之外的任何字符,然后匹配A-Z) Close lookahead[^?\n]+ Match End chars a a newline$ End of 1+ ? (关闭字符串匹配字符串或字符串末尾以外的字符)
例如
object Bob {
def response(statement: String): String = {
statement.trim() match {
case x if x.isEmpty => "Fine. Be that way!"
case x if x.matches("^[A-Z0-9\\n][^a-z].+\\?$") => "Calm down, I know what I'm doing!"
case x if x.matches("^.+\\?$") => "Sure."
case x if x.matches ("^(?=[^A-Z]*[A-Z])[^?\\n]+$") => "Whoa, chill out!"
case _ => "Whatever."
}
}
}
Bob.response("1, 2, 3 GO!")
Bob.response("1, 2, 3")输出
val res0: String = Whoa, chill out!
val res1: String = Whatever.https://stackoverflow.com/questions/68658547
复制相似问题