Kotlin中contains方法判断含英文字母返回false问题排查
Kotlin中contains判断包含英文字母始终返回false的问题解决
问题根源
你写的代码逻辑完全搞反了:
- 你定义的
eLang是一长串包含大小写字母和空格的拼接字符串 - 调用
input_string?.contains(eLang, ignoreCase = true)时,实际是在检查输入字符串是否包含整个eLang作为子串,而非判断输入里是否存在任意一个英文字母。普通输入不可能匹配这一大串内容,所以结果永远返回false。
正确解决方案
以下是几种靠谱的判断输入是否包含英文字母的方法:
方法1:正则表达式匹配(最简洁)
用正则直接匹配任意大小写英文字母:
val hasEnglishLetter = input_string?.matches(Regex(".*[a-zA-Z].*")) ?: false println(hasEnglishLetter)
解释:.*匹配任意长度的任意字符,[a-zA-Z]匹配单个大小写英文字母,整个正则表示字符串中至少存在一个英文字母。
方法2:遍历字符检查(直观)
通过any函数遍历字符串,判断是否存在符合条件的字符:
val hasEnglishLetter = input_string?.any { it.isLetter() } ?: false println(hasEnglishLetter)
解释:Char.isLetter()会直接判断字符是否为字母(包含大小写英文字母),any函数只要找到一个符合条件的字符就返回true。
方法3:字符范围判断(手动校验)
直接指定字符的范围区间:
val hasEnglishLetter = input_string?.any { it in 'a'..'z' || it in 'A'..'Z' } ?: false println(hasEnglishLetter)
修正后的完整代码示例
顺便修复了原代码中readLine().toString()的潜在问题(输入为空时会得到"null"字符串):
class Loop { public val input_string: String? = readLine() public val input_size = readLine()?.toInt() fun looping(a: String, b: Int) { if ((input_size ?: 0) > 1 && !input_string.isNullOrEmpty()) { for (i in 0 until input_size!!) { println(input_string) } input_string.let { println("length word you type : ${it.length}") } input_size.let { println("Count looping: $it") } // 用正则判断是否包含英文字母 val hasEnglishLetter = input_string.matches(Regex(".*[a-zA-Z].*")) println(hasEnglishLetter) } } }
内容的提问来源于stack exchange,提问作者Tom Levi
相关产品推荐
相关产品推荐

