高级规则配置

本指南将展示如何使用 Double Entry Generator 的高级功能来创建复杂的匹配规则和账户映射。

复杂条件匹配

多字段组合条件

rules:
  - name: "信用卡还款"
    conditions:
      - field: "description"
        contains: ["信用卡", "还款"]
      - field: "amount"
        greater_than: 0
      - field: "type"
        equals: "转账"
    target_account: "Assets:Bank:Checking"
    target_account_minus: "Liabilities:CreditCard"
    tags: ["credit-card", "payment"]

正则表达式匹配

rules:
  - name: "股票交易"
    conditions:
      - field: "description"
        regex: ".*股票.*|.*证券.*|.*交易.*"
      - field: "amount"
        regex: "^-?[0-9]+(\.[0-9]+)?$"
    target_account: "Assets:Securities"
    tags: ["stock", "investment"]

金额范围匹配

rules:
  - name: "大额消费"
    conditions:
      - field: "amount"
        greater_than: 1000
      - field: "description"
        not_contains: ["工资", "奖金", "转账"]
    target_account: "Expenses:Large"
    tags: ["large-expense"]
    note: "大额消费,需要特别关注"

动态账户映射

基于金额的账户选择

rules:
  - name: "餐饮消费 - 小额"
    conditions:
      - field: "description"
        contains: ["美团", "饿了么", "餐厅", "外卖"]
      - field: "amount"
        less_than: 50
    target_account: "Expenses:Food:Small"
    tags: ["food", "small"]

  - name: "餐饮消费 - 大额"
    conditions:
      - field: "description"
        contains: ["美团", "饿了么", "餐厅", "外卖"]
      - field: "amount"
        greater_than_or_equal: 50
    target_account: "Expenses:Food:Large"
    tags: ["food", "large"]

基于时间的账户选择

rules:
  - name: "工作日交通"
    conditions:
      - field: "description"
        contains: ["地铁", "公交", "出租车"]
      - field: "time"
        weekday: [1, 2, 3, 4, 5]  # 周一到周五
    target_account: "Expenses:Transport:Work"
    tags: ["transport", "work"]

  - name: "周末交通"
    conditions:
      - field: "description"
        contains: ["地铁", "公交", "出租车"]
      - field: "time"
        weekday: [6, 7]  # 周六和周日
    target_account: "Expenses:Transport:Personal"
    tags: ["transport", "personal"]

复杂账户映射

多级账户结构

accounts:
  # 基础账户映射
  "支付宝": "Assets:Alipay"
  "微信": "Assets:WeChat"
  "建设银行": "Assets:Bank:CCB"
  "工商银行": "Assets:Bank:ICBC"
  
  # 商户账户映射
  "美团": "Expenses:Food:Delivery"
  "饿了么": "Expenses:Food:Delivery"
  "星巴克": "Expenses:Food:Coffee"
  "麦当劳": "Expenses:Food:FastFood"
  
  # 服务账户映射
  "中国移动": "Expenses:Utilities:Phone"
  "中国联通": "Expenses:Utilities:Phone"
  "国家电网": "Expenses:Utilities:Electricity"
  "自来水公司": "Expenses:Utilities:Water"

正则表达式账户映射

accounts:
  # 使用正则表达式匹配
  ".*银行.*": "Assets:Bank:Other"
  ".*证券.*": "Assets:Securities"
  ".*基金.*": "Assets:Funds"
  ".*保险.*": "Expenses:Insurance"

标签和元数据

智能标签系统

rules:
  - name: "网购消费"
    conditions:
      - field: "description"
        contains: ["淘宝", "京东", "天猫", "拼多多"]
    target_account: "Expenses:Shopping:Online"
    tags: ["shopping", "online"]
    metadata:
      category: "shopping"
      platform: "online"
      review_required: true

  - name: "实体店消费"
    conditions:
      - field: "description"
        contains: ["超市", "商场", "便利店"]
    target_account: "Expenses:Shopping:Offline"
    tags: ["shopping", "offline"]
    metadata:
      category: "shopping"
      platform: "offline"
      review_required: false

动态标签生成

rules:
  - name: "月度订阅"
    conditions:
      - field: "description"
        contains: ["会员", "订阅", "VIP"]
    target_account: "Expenses:Subscriptions"
    tags: ["subscription", "monthly"]
    dynamic_tags:
      - field: "description"
        extract: "([A-Za-z]+).*会员"
        prefix: "service:"

错误处理和验证

数据验证规则

validation:
  required_fields: ["date", "amount", "description"]
  amount_format: "decimal"
  date_format: "YYYY-MM-DD"
  
rules:
  - name: "数据验证 - 金额"
    conditions:
      - field: "amount"
        regex: "^-?[0-9]+(\.[0-9]{1,2})?$"
    action: "validate"
    error_message: "金额格式不正确"
    
  - name: "数据验证 - 日期"
    conditions:
      - field: "date"
        regex: "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
    action: "validate"
    error_message: "日期格式不正确"

异常处理

rules:
  - name: "异常交易处理"
    conditions:
      - field: "amount"
        greater_than: 10000
    target_account: "Expenses:Unknown:Large"
    tags: ["exception", "review-required"]
    note: "大额异常交易,需要人工审核"
    requires_review: true

配置文件组织

模块化配置

# config.yaml - 主配置文件
default:
  default_minus_account: "Assets:Bank:Checking"
  default_plus_account: "Expenses:Unknown"
  default_currency: "CNY"
  default_tags: ["imported"]

# 引入其他配置文件
includes:
  - rules/bank-rules.yaml
  - rules/payment-rules.yaml
  - rules/investment-rules.yaml
  - accounts/account-mapping.yaml
# rules/bank-rules.yaml - 银行规则
rules:
  - name: "银行转账"
    conditions:
      - field: "description"
        contains: ["转账", "汇款"]
    target_account: "Assets:Bank:Checking"
    tags: ["transfer"]
# accounts/account-mapping.yaml - 账户映射
accounts:
  "建设银行": "Assets:Bank:CCB"
  "工商银行": "Assets:Bank:ICBC"
  "支付宝": "Assets:Alipay"
  "微信": "Assets:WeChat"

最佳实践

1. 规则优先级

# 规则按顺序匹配,越具体的规则应该放在前面
rules:
  - name: "星巴克消费"  # 最具体
    conditions:
      - field: "description"
        contains: ["星巴克"]
    target_account: "Expenses:Food:Coffee:Starbucks"
    
  - name: "咖啡消费"    # 较具体
    conditions:
      - field: "description"
        contains: ["咖啡", "coffee"]
    target_account: "Expenses:Food:Coffee"
    
  - name: "餐饮消费"    # 最通用
    conditions:
      - field: "description"
        contains: ["餐厅", "外卖"]
    target_account: "Expenses:Food"

2. 性能优化

# 使用索引字段提高匹配性能
indexed_fields:
  - "description"
  - "amount"
  - "type"

# 避免过于复杂的正则表达式
rules:
  - name: "简单匹配"
    conditions:
      - field: "description"
        contains: ["关键词1", "关键词2"]  # 推荐
    # 而不是使用复杂的正则表达式

3. 测试和调试

# 添加调试信息
debug: true
log_level: "info"

rules:
  - name: "调试规则"
    conditions:
      - field: "description"
        contains: ["测试"]
    target_account: "Expenses:Test"
    tags: ["debug", "test"]
    debug_info: "这是一个测试规则"

常见问题

Q: 如何处理重复的规则?

A: 规则按顺序匹配,第一个匹配的规则会被使用。建议将更具体的规则放在前面。

Q: 正则表达式性能如何优化?

A: 避免使用过于复杂的正则表达式,优先使用简单的字符串匹配。

Q: 如何调试规则匹配问题?

A: 启用调试模式,查看详细的匹配日志。

Q: 如何处理特殊字符?

A: 在正则表达式中正确转义特殊字符,或使用字符串匹配。