从转换为文本格式的PDF中提取以逗号为千分隔符的美元价格和数字

Extracting dollar prices and numbers with comma as thousand separator from PDF converted to text format(从转换为文本格式的PDF中提取以逗号为千分隔符的美元价格和数字)
本文介绍了从转换为文本格式的PDF中提取以逗号为千分隔符的美元价格和数字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用c#编辑一些带有美元金额的pdf。以下是我尝试过的内容

@"/ (d)(?= (?:d{ 3})+(?:.|$))| (.dd ?)d *$/ g"
@"(?<=each)(((d*[,|.]d{2,3}))*)"
@"(?<=each)(((d*[,|.]d{2,3}))*)"
@"d+.d{2}"

以下是它需要匹配的一些测试用例

76,249.25
131,588.00
7.09
21.27
420.42
54.77
32.848
3,056.12
0.009
0.01
32.85
2,948.59
$99,249.25
$9.0000
$1,800.0000
$1,000,000

以下是它不应针对的一些测试用例

666-257-6443
F1A 5G9
Bolt, Locating, M8 x 1.25 x 30 L
Precision Washer, 304 SS, 0.63 OD x 0.31
Flat Washer 300 Series SS; Pack of 50
U-SSFAN 0.63-L6.00-F0.75-B0.64-T0.38-SC5.62
U-CLBUM 0.63-D0.88-L0.875
U-WSSS 0.38-D0.88-T0.125
U-BGHK 6002ZZ - H1.50
U-SSCS 0.38-B0.38
6412K42
Std Dowel, 3/8" x 1-1/2" Lg, Steel
2019.07.05
2092-002.0180
SHCMG 0.25-L1.00
280160717

请注意,c#部分正在与iText 7 pdfSweep接口。

Guid g = new Guid();

            CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();

            string guid = g.ToString();
            string input = @"C:UsersJMDocumentspdftest61882 _280011434 (1).pdf";
            string output = @"C:UsersJMDocumentspdftest61882 _2800011434 (1) x2" + guid+".pdf";

            string regex = @"(?m)^$?[0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?$";

                 strategy.Add(new RegexBasedCleanupStrategy(regex));

            PdfDocument pdf = new PdfDocument(new PdfReader(input), new PdfWriter(output));
            PdfAutoSweep autoSweep = new PdfAutoSweep(strategy);
            autoSweep.CleanUp(pdf);
            pdf.Close();

请分享您的智慧

推荐答案

您可以使用

$?[0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?

或者,如果价格是整行的:

^$?[0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?$

请参阅regex demo

奖金:要仅获取价格值,您需要删除$后面的?以使其成为必填项:

$([0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?)

(我添加了一个捕捉组,以防您需要将数字值与$字符分开访问)。

如果您需要支持任何货币字符,而不仅仅是$,请将$替换为p{Sc}

详细信息

  • ^-字符串开始
  • $?-可选的美元符号
  • [0-9]{1,3}-一到三位数
  • (?:,[0-9]{3})*-逗号和三位数字的任意0个或更多重复
  • (?:.[0-9]+)?-一个可选的点序列,然后是任意一个或多个数字
  • $-字符串结束。

C#检查是否匹配:

if (Regex.IsMatch(str, @"^$?[0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?$")) 
{
    // there is a match
}

pdfSweep注意:

应用the fix from this answer。关键是在分析文本时会丢失换行符。然后,您需要的正则表达式是

@"(?m)^$?[0-9]{1,3}(?:,[0-9]{3})*(?:.[0-9]+)?
?$"

WHERE(?m)使^$匹配行的开始/结束,并且 ?是必需的,因为$在.NET正则表达式中只在LF之前匹配,而不在CRLF之前匹配。

这篇关于从转换为文本格式的PDF中提取以逗号为千分隔符的美元价格和数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)