android - Android 模式匹配器未能检测到特殊字符
问题描述
我的要求是接受具有 3-50 个字符且只能包含字母数字、空格(仅限中间)和连字符的字符串输入。
这是我的测试用例
class TestInput {
@Test
fun testUsernameValidation() {
println("Testing Valid UserName")
val tests = arrayOf(
"HelL&",
"HelL&&",
"HelL+&^% w0rld~",
"hello-the|_++)_%re",
" Sample",
"sh",
"slugging-patternsSLUGGING-pattern",
"sipletext"
)
tests.forEach {
println("${it.isValidUserName()}\t$it")
}
}
}
还有我的分机
fun String.isValidUserName(): Boolean {
val pattern = Pattern.compile(
"[^\\s]" +
"[a-zA-Z 0-9\\-]{0,50}" +
"[^\\s]" )
return this.length in 3..50
&& pattern.matcher(this).matches()
}
该测试产生结果:
Testing Valid UserName
true HelL&
false HelL&&
false HelL+&^% w0rld~
false hello-the|_++)_%re
false Sample
false sh
true slugging-patternsSLUGGING-pattern
true sipletext
唯一的问题是第一个仅包含 1 个特殊字符的字符串返回 true。我创建的 Pattern 有什么问题吗?
解决方案
我想通了,问题是模式的第一部分和最后一部分 [^\s] 表明它接受除空格之外的任何内容。
我以这种方式改变了模式,现在它可以工作了。
fun String.isValidUserName(): Boolean {
val pattern = Pattern.compile(
"[a-zA-Z0-9\\-]{1}" +
"[a-zA-Z 0-9\\-]{0,50}" +
"[a-zA-Z0-9\\-]{1}"
)
return this.length in 3..50
&& pattern.matcher(this).matches()
}
推荐阅读
- oracle - 如何在 oracle 中设置 remote_listener
- sql - 在 postgresql 上选择 LIMIT 1 需要很长时间
- javascript - 如何选择只有特定类的元素?
- php - PHP/MYSQL:删除查询删除相关行后更新查询
- scala - elastic4s hitreader throw error value to is not a member of Either[..]
- android - 如何添加双通知图标?
- c# - C# VSTO:Visual Studio 加载工作簿但不加载工作表
- java - 如何在不获取 StackOverflowException 的情况下重复可覆盖的方法?
- docker - docker build:返回一个非零代码:127**
- python - 在 python 中使用 Discord API 下载附件