首页 > 解决方案 > 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 有什么问题吗?

标签: androidregex

解决方案


我想通了,问题是模式的第一部分和最后一部分 [^\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()
}

推荐阅读