feat: 添加 UI 状态管理,支持新增记录底部弹窗功能,优化设置和主页交互
This commit is contained in:
@@ -187,26 +187,59 @@ const extractAmount = (text = '') => {
|
||||
return loose?.[1] ? Math.abs(parseFloat(loose[1])) : 0
|
||||
}
|
||||
|
||||
// 判断字符串是否更像是「金额」而不是商户名,用于避免把「1.00元」当成商户
|
||||
const looksLikeAmount = (raw = '') => {
|
||||
const value = String(raw).trim()
|
||||
if (!value) return false
|
||||
const amountPattern = /^[-\d.,]+\s*(?:元|块钱|¥|¥|人民币)?$/
|
||||
return amountPattern.test(value)
|
||||
}
|
||||
|
||||
const extractMerchant = (text, rule) => {
|
||||
const content = text || ''
|
||||
|
||||
if (rule?.merchantPattern instanceof RegExp) {
|
||||
const m = text.match(rule.merchantPattern)
|
||||
const m = content.match(rule.merchantPattern)
|
||||
if (m?.[1]) return m[1].trim()
|
||||
}
|
||||
|
||||
// 通用的「站点 A -> 站点 B」线路模式(公交/地铁通知),
|
||||
// 即使未命中专用规则也尝试提取,避免退化为金额或「Unknown」
|
||||
const routeMatch = content.match(
|
||||
/([\u4e00-\u9fa5]{2,}\s*(?:-|—|>|→|至|到|->)\s*[\u4e00-\u9fa5]{2,})/,
|
||||
)
|
||||
if (routeMatch?.[1]) {
|
||||
return routeMatch[1].trim()
|
||||
}
|
||||
|
||||
const genericPatterns = [
|
||||
/向\s*([\u4e00-\u9fa5A-Za-z0-9\-\s&]+)/,
|
||||
/商户[::]?\s*([\u4e00-\u9fa5A-Za-z0-9\-\s&]+)/,
|
||||
]
|
||||
|
||||
for (const pattern of genericPatterns) {
|
||||
const m = text.match(pattern)
|
||||
const m = content.match(pattern)
|
||||
if (m?.[1]) return m[1].trim()
|
||||
}
|
||||
|
||||
const parts = text.split(/:|:/)
|
||||
// 针对「……支出(消费支付宝-上海拉扎斯信息科技有限公司)3.23元」这类银行通知,
|
||||
// 优先尝试从括号中的「支付宝-商户名」结构中提取真正的商户名
|
||||
const parenMatch = content.match(/\(([^)]+)\)/)
|
||||
if (parenMatch?.[1]) {
|
||||
const inner = parenMatch[1]
|
||||
const payMatch = inner.match(/(?:支付宝|微信支付|微信)[-—\s]*([^\d元¥¥]+)$/)
|
||||
if (payMatch?.[1]) {
|
||||
const candidate = payMatch[1].trim()
|
||||
if (candidate && !looksLikeAmount(candidate)) {
|
||||
return candidate
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const parts = content.split(/:|:/)
|
||||
if (parts.length > 1) {
|
||||
const candidate = parts[1].split(/[,,\s]/)[0]
|
||||
if (candidate) return candidate.trim()
|
||||
if (candidate && !looksLikeAmount(candidate)) return candidate.trim()
|
||||
}
|
||||
|
||||
return 'Unknown'
|
||||
|
||||
Reference in New Issue
Block a user