Kotlin的matchEntire正则函数未捕获Java等效函数可识别内容的问题
解决Kotlin中Regex.matchEntire无法匹配股票代码的问题
你遇到的问题根源在于Kotlin的Regex构造器不支持JavaScript风格的/pattern/flags语法——你写的正则里开头的/和结尾的/i会被当成正则模式的一部分,而实际的股票代码肯定不会包含这些字符,所以matchEntire自然匹配失败。
修正步骤
- 移除多余的
/包裹符:Kotlin的Regex构造函数只需要传入纯正则模式字符串,不需要前后的/。 - 正确设置忽略大小写选项:把原来的
/i换成Kotlin支持的方式,有两种选择:- 在正则模式开头添加
(?i)内联修饰符 - 在
Regex构造时传入RegexOption.IGNORE_CASE参数
- 在正则模式开头添加
修正后的代码
fun String.isValidTickerSymbol(): Boolean { // 方式1:使用内联忽略大小写修饰符 (?i) val validTickerFormat = Regex("(?i)^(([a-z]{2,4}):(?![a-z\\d]+\\.))?([a-z]{1,4}|\\d{1,3}(?=\\.)|\\d{4,})(\\.([a-z]{2}))?$") // 方式2:使用RegexOption.IGNORE_CASE参数 // val validTickerFormat = Regex("^(([a-z]{2,4}):(?![a-z\\d]+\\.))?([a-z]{1,4}|\\d{1,3}(?=\\.)|\\d{4,})(\\.([a-z]{2}))?$", RegexOption.IGNORE_CASE) return validTickerFormat.matchEntire(this) != null }
为什么原来的Java代码能工作?
Java的Pattern.compile方法也是接收纯模式字符串,再通过Pattern.CASE_INSENSITIVE设置忽略大小写,你原来的Java代码应该没有带/和/i的包裹,所以能正常匹配。而Kotlin里误用了JS风格的正则写法,导致模式包含了多余的字符,破坏了匹配逻辑。
测试用例验证
你可以用这些示例代码测试修复后的函数:
fun main() { println("AAPL".isValidTickerSymbol()) // true println("NYSE:MSFT".isValidTickerSymbol()) // true println("0001.HK".isValidTickerSymbol()) // true println("1234".isValidTickerSymbol()) // true println("INVALID.TOO_LONG".isValidTickerSymbol()) // false }
内容的提问来源于stack exchange,提问作者James C
相关产品推荐
相关产品推荐

