You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式提取DD/MM/YYYY格式发票日期前的数据?

解决方案:提取DD/MM/YYYY日期前的发票编号

问题背景

需提取发票编号,已知唯一规律是发票编号后紧跟DD/MM/YYYY格式的日期,原正则因发票编号格式多样失效。

原尝试正则:

(\d{7,8})|([A-Za-z0-9\/]{12})|([0-9\/-]{8,9})

可行正则表达式

基础版本(匹配任意DD/MM/YYYY格式日期)

^(.*?)\s+\d{2}/\d{2}/\d{4}$

严谨版本(校验日期合法性,限制日01-31、月01-12)

^(.*?)\s+(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/\d{4}$

正则说明

  • ^:锁定字符串起始位置
  • (.*?):非贪婪捕获任意字符,确保仅提取日期前的发票编号内容
  • \s+:匹配发票编号与日期之间的一个或多个空格分隔符
  • 日期匹配部分:
    • 基础版\d{2}/\d{2}/\d{4}:简单匹配两位日/两位月/四位年的格式
    • 严谨版通过正则限制日、月的合法范围,避免匹配无效日期
  • $:锁定字符串结束位置

使用示例(Python)

import re

sample_data = [
    "91504458 26/04/2022",
    "TYRES/REEXPORT 04/07/2022",
    "TYRES/RE-EXPORT 23/09/2022",
    "SAM0112/2022 23/05/2021",
    "020/22-23 17/02/2022",
    "SAM0141/2022 19/03/1975",
    "91/22-23 01/01/2022",
    "SAM0159/2022 15/08/2021",
    "111/22-23 09/09/2021",
    "SAM0106/2022 09/09/2022",
    "017/2022 08/08/2022",
    "91/22-23 07/07/2022"
]

pattern = re.compile(r'^(.*?)\s+\d{2}/\d{2}/\d{4}$')
for line in sample_data:
    match = pattern.match(line)
    if match:
        print(match.group(1))

运行输出与预期完全一致:

91504458
TYRES/REEXPORT
TYRES/RE-EXPORT
SAM0112/2022
020/22-23
SAM0141/2022
91/22-23
SAM0159/2022
111/22-23
SAM0106/2022
017/2022
91/22-23

内容的提问来源于stack exchange,提问作者manjesh kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:30:49