Kotlin价格正则提取异常:金额为空、货币位置判断错误
价格字符串提取问题的正则修正方案
问题根源分析
你的问题核心出在正则匹配的分支逻辑设计和位置判断的逻辑对应上:
- 输入
$100时金额为空:大概率是正则未正确捕获货币后的金额,要么是分组顺序搞反,要么是没使用全匹配规则(如matchEntire)导致部分匹配,或金额的匹配规则有遗漏。 - 输入
100 $时位置判断反:肯定是你把「货币后置」的场景错误标记为了「前置」,比如判断逻辑中搞混了捕获组对应的位置关系。
修正后的实现方案
下面是能正确处理两种场景的Kotlin代码,核心是分两个正则分支分别匹配「货币在前」和「货币在后」的情况,避免逻辑混淆:
// 定义返回结果的数据类 data class PriceExtractResult( val currency: String, val amount: String, val isCurrencyBefore: Boolean ) fun extractPriceInfo(priceStr: String): PriceExtractResult? { // 匹配货币在金额前的格式(如 $100、¥99.9) val currencyBeforePattern = Regex("""^(\D+?)(\d+(?:\.\d+)?)$""") currencyBeforePattern.matchEntire(priceStr.trim())?.let { match -> return PriceExtractResult( currency = match.groupValues[1].trim(), amount = match.groupValues[2], isCurrencyBefore = true ) } // 匹配货币在金额后的格式(如 100 $、99.9 ¥) val currencyAfterPattern = Regex("""^(\d+(?:\.\d+)?)(\D+?)$""") currencyAfterPattern.matchEntire(priceStr.trim())?.let { match -> return PriceExtractResult( currency = match.groupValues[2].trim(), amount = match.groupValues[1], isCurrencyBefore = false ) } return null // 不匹配任何格式时返回null }
关键说明
- 用
matchEntire确保正则匹配整个字符串,避免部分匹配导致的捕获错误。 - 拆分两个分支分别处理两种位置场景,逻辑清晰,不会搞混位置判断。
- 正则中
\D+?用非贪婪匹配避免捕获多余字符,\d+(?:\.\d+)?同时支持整数和小数金额。 - 前后加入
trim()处理,兼容带空格的场景(如100 $)。
测试验证
- 输入
$100:返回PriceExtractResult(currency="$", amount="100", isCurrencyBefore=true) - 输入
100 $:返回PriceExtractResult(currency="$", amount="100", isCurrencyBefore=false)
内容的提问来源于stack exchange,提问作者edi233
相关产品推荐
相关产品推荐

