在Apple Numbers中使用正则表达式提取不同格式发票中发票号的方案咨询
嘿,我完全懂你现在的困扰——不同公司的发票格式五花八门,字段顺序乱得很,而且Apple Numbers还不支持PCRE里的\K语法,之前能用的正则直接就失效了对吧?别慌,咱们来一步步搞定这个问题。
首先先梳理下你给出的两个示例发票文本:
示例1(XYZ公司):This is invoice from company XYZ - 1234545 product name , product number 444456, information invoice unit cost $12.0 and invoice total $1343.00
示例2(ABC公司):This is invoice from company ABC - 1234545 product name and information invoice total cost $6777 and invoice unit cost $654
你会发现这两个例子里,发票号都是紧跟在company [公司名] - 这个结构之后的一串数字,这就是我们可以利用的共性。因为Apple Numbers用的是ICU正则引擎,不支持\K,那我们就用捕获组来替代它的功能,通过REGEX.EXTRACT函数提取捕获到的内容。
针对你给出的示例的解决方案
直接用下面这个正则表达式配合Numbers的函数就能提取出发票号:
company [^-]+ - (\d+)
对应的Numbers公式(假设发票文本在A1单元格):
=REGEX.EXTRACT(A1, "company [^-]+ - (\d+)")
我来拆解下这个正则的逻辑:
company [^-]+:匹配company之后直到短横-之前的所有内容(不管公司名是字母、数字还是混合字符都能覆盖)-:精准匹配短横和后面的空格(\d+):把后面的连续数字(也就是发票号)放到捕获组里,Numbers的REGEX.EXTRACT会自动返回这个捕获组的内容
测试一下的话,不管是XYZ还是ABC公司的发票文本,这个公式都能返回你想要的1234545。
更通用的扩展方案
如果遇到其他格式的发票,比如发票号前面的关键词不是company [公司名] - ,而是Invoice #、Inv No:这类,我们可以用正则的分支结构来匹配多种前缀:
(invoice # |inv no: |company [^-]+ - )(\d+)
对应的公式:
=REGEX.EXTRACT(A1, "(invoice # |inv no: |company [^-]+ - )(\d+)")
这里的逻辑是同时匹配多种可能的发票号前缀,然后捕获后面的数字串。
另外,如果你的发票号是文本中最长的数字串(比如比产品编号、单价总价的数字都长),还可以用这个正则来直接匹配最长数字串:
(\d{7,})
(这里的{7,}表示匹配7位及以上的数字,你可以根据自己发票号的长度调整位数)
小提醒
不同公司的发票格式可能会有特殊情况,比如发票号包含字母或连字符(比如INV-67890),这时候你需要调整正则的匹配规则,比如改成([A-Z]+-\d+)来匹配这种格式的发票号。建议先收集几种不同格式的发票文本,测试正则是否能准确提取,再批量应用。
备注:内容来源于stack exchange,提问作者sit123

