Android Pattern matcher не удалось обнаружить специальный символ - PullRequest
0 голосов
/ 02 декабря 2019

Мое требование - принимать строковый ввод длиной от 3 до 50 символов, который может содержать только буквенно-цифровые символы, пробелы (только в середине) и дефис.

Вот мой TestCase

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. Что-то не так с созданным мной шаблоном?

1 Ответ

0 голосов
/ 02 декабря 2019

Я понял, проблема в первой и последней части шаблона [^ \ 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...