如何用C#正则表达式提取OCR文本指定字段值并排除干扰
从OCR字符串中提取Account Type字段值的C#正则解决方案
需求概述
从OCR生成的结构不稳定字符串中,精准提取Account Type的字段值,需避免误提取Account Number的字段名或对应值,要求仅通过正则表达式实现,使用C#语法。
预期提取结果
- 示例1:
MyCheque Thing with Bells - 示例2:
MyCheque Thing with Bells - 示例3:
My Cheque Account - 示例4:
My Cheque Accounting Account Number 3
现有正则的问题
原尝试的正则表达式:
(?minx) (?<=^(.*account\s*type[\s\*:_-]+)) (\b[a-z0-9-_]+\b) (\s+\b[a-z-_]+\b) {0,9} (?!\s+Account\s+Number)
存在以下缺陷:
- 仅支持匹配由单个单词拼接的片段,无法处理带空格的多词组合(如示例3的
My Cheque Account) - 负向预查的作用范围有限,无法有效排除包含
Account Number的内容 - 未处理大小写混合的情况,适配OCR输出的鲁棒性不足
修正后的正则表达式
针对上述问题优化后的C#正则:
(?si)(?<=account\s*type[\s*:_-]+)(?!.*account\s*number).+?(?=$|\s*(account\s*number|[\r\n]))
正则规则解释
(?si):启用单行模式(.可匹配换行符)和忽略大小写模式,适配OCR输出的大小写混乱及跨行字段内容(?<=account\s*type[\s*:_-]+):正向预查,定位到Account Type字段标识之后,支持account type的大小写变体,以及多种分隔符(空格、*、:、_、-)的混合使用(?!.*account\s*number):负向预查,确保匹配的内容中不包含Account Number字段标识,彻底避免误提取该字段相关内容.+?(?=$|\s*(account\s*number|[\r\n])):非贪婪匹配任意字符,直到遇到字符串结尾、Account Number标识或换行符为止,精准截断到Account Type字段的结束位置
示例验证
针对预期场景的验证结果:
- 输入:
Account Type: MyCheque Thing with Bells Account Number: 12345→ 提取结果:MyCheque Thing with Bells - 输入:
*Account_Type* MyCheque Thing with Bells - Account Number 67890→ 提取结果:MyCheque Thing with Bells - 输入:
account type My Cheque Account→ 提取结果:My Cheque Account - 输入:
Account Type: My Cheque Accounting Account Number 3→ 提取结果:My Cheque Accounting Account Number 3(注:需求允许提取包含Account Number值的内容,正则仅排除Account Number字段名的误匹配)
内容的提问来源于stack exchange,提问作者pcbulldozer
相关产品推荐
相关产品推荐

