我正在尝试验证输入字符串是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
类的理解是错误的吗?正则表达式本身中的转义字符是否发生了奇怪的事情?
答案 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}
相匹配