所以基本上我需要运行一个程序来检查第一个字符是否为大写。如果是这样,它会通过。然后,我需要检查其余字符是否为小写。我目前有此代码,但问题是,如果我在字符串上插入大写字母,然后以小写字母结尾,则可以继续执行,但不应该这样做。该程序需要询问用户另一个“名称”,如果它的第一个字符后有大写字母。 (很抱歉,如果不是很明确,我的英语不是那么好:/)
var lowercases = ' '
do {
println("Insert a name")
val name = readLine()!!.toString()
val First = name[0]
if (First.isUpperCase()) {
for (caracter in 1 until name.length) {
lowercases = name[caracter]
if (lowercases.isLowerCase()) {
}
}
} else{
println("olha nao da")
}
} while (First.isLowerCase() || lowercases.isUpperCase())
答案 0 :(得分:3)
我将支票拆分为一个单独的功能。这不仅使逻辑更简单,而且允许您给它起描述性的名称。它非常适合作为String的扩展功能:
fun String.isTitleCase()
= isNotEmpty() && this[0].isUpperCase() && drop(1).all{ it.isLowerCase() }
这意味着:String
如果不为空,则为大写字母,第一个字符为大写字母,除第一个字符外的所有字符均为小写字母。 (如果您也想处理连字,则还要检查第一个字符isTitleCase()
和isUpperCase()
。)
(当然,您可以将其编写为块样式的多行函数,可能带有循环和return
s,但是当其他条件相同时,我更喜欢较短的版本!)
您的主代码则不必担心如何完成检查,并且变得更加简单:
while (true) {
println("Enter a name:")
val name = readLine()
if (name != null && name.isTitleCase()) {
// Do stuff
break
} else {
println("olha nao da")
}
}
(我已经用空检查替换了!!
,这更加安全。我也将do
…while
循环更改为while
循环并使用break
来避免重复检查。并且不需要调用toString()
,因为readLine()
已经给了您String
或null
。)
答案 1 :(得分:-1)
使用正则表达式更快,更干净:
val regex = """[A-Z][^A-Z]+""".toRegex()
var name
do{
println("Insert a name")
name = readLine()?.toString() :? "."
}while(!regex matches name)
另一种方式:
do {
println("Insert a name")
val name = readLine()!!.toString()
var curChar = name[0]
if(name.length > 1){
if (curChar.isUpperCase()) {
for (i in 1 until name.length) {
curChar = name[i]
if (curChar.isLowerCase()) {
// you send no code for this block
}else{
break//as you wish if character is uppercase asks from user again
}
}
} else{
println("olha nao da")//your message as you send
}
}
} while (curChar.isUpperCase())