Kotlin的matchEntire正则表达式函数没有捕获它的Java等价物

时间:2018-04-22 00:20:36

标签: android regex kotlin

我正在尝试验证输入字符串是Android应用中的有效股票代码符号。正则表达式和我使用的测试用例都不是原始的:它们已经过验证here

什么是原创,是我对原始Java代码改编为Kotlin:

fun String.isValidTickerSymbol(): Boolean {
    val validTickerFormat = Regex("/^(([a-z]{2,4}):(?![a-z\\d]+\\.))?([a-z]{1,4}|\\d{1,3}(?=\\.)|\\d{4,})(\\.([a-z]{2}))?$/i")
    val results = validTickerFormat.matchEntire(this)?.groupValues

    return (results != null)
}

当我在其上运行我的JUnit测试套件时(断言语法在Kluent之后);它在“GOOG”失败,告诉我字符串无效,应该是什么时候。

"JELK90#$".isValidTickerSymbol() shouldEqual false
"1".isValidTickerSymbol() shouldEqual false
"0".isValidTickerSymbol() shouldEqual false
"R".isValidTickerSymbol() shouldEqual false
"25.36".isValidTickerSymbol() shouldEqual false
"1.0".isValidTickerSymbol() shouldEqual false
"GOOG".isValidTickerSymbol() shouldEqual true
"NYSE:C".isValidTickerSymbol() shouldEqual true //with exchange code NYSE
"GOOG.BY".isValidTickerSymbol() shouldEqual true //with exchange code BY
"$90".isValidTickerSymbol() shouldEqual false
"98774".isValidTickerSymbol() shouldEqual true //because more than 4 digit long
"789.BY".isValidTickerSymbol() shouldEqual true //because ends with .[A-Z]{2,2}

我对kotlin.text.Regex类的理解是错误的吗?正则表达式本身中的转义字符是否发生了奇怪的事情?

1 个答案:

答案 0 :(得分:0)

我尝试使用以下Kotlin代码(注意我从正则表达式中删除了分隔符):

fun main(args: Array<String>) {
    val regex =
        Regex("^(([a-z]{2,4}):(?![a-z\\d]+\\.))?([a-z]{1,4}|\\d{1,3}(?=\\.)|\\d{4,})(\\.([a-z]{2}))?$",
              RegexOption.IGNORE_CASE)
    listOf("JELK90#$",
           "1",
           "0",
           "R",
           "25.36",
           "1.0",
           "GOOG",
           "NYSE:C",
           "GOOG.BY",
           "$90",
           "98774",
           "789.BY").forEach {
        val results = regex.matchEntire(it)?.groupValues
        println(results)
    }
}

结果如下:

null
null
null
[R, , , R, , ]
null
null
[GOOG, , , GOOG, , ]
[NYSE:C, NYSE:, NYSE, C, , ]
[GOOG.BY, , , GOOG, .BY, BY]
null
[98774, , , 98774, , ]
[789.BY, , , 789, .BY, BY]

因此,它与您期望的完全匹配加上“R”,它与第3个捕获组中的[a-z]{1,4}相匹配