我尝试使用RegEx从PDF时间表中解析支付期内的总工作小时数。
举例来说:
加班总小时数:总时数:2.2 1.0 1.0 3.5 5.0 12.7签名:
(?<=Total Hours:*(?:.*?( )+){6}).*
字符串
总小时数将始终是以“总小时数:”开头的行上的最后一个数字
上面的RegEx代码适用于大多数每周工作5天的员工,但如果他们的工作时间超过或少于5天,则会中断,如下面的示例所示:
加班总小时数:总时数:2.2 1.0 1.0 3.5 5.0 6.3 19.0签名:
regexr.com/7hci1
有什么想法可以调整,总是抓住最后一个十进制数的行开始与“总小时数:”?
谢谢你,谢谢
1条答案
按热度按时间t9aqgxwy1#
您可以使用的.NET兼容正则表达式是
字符串
参见regex demo。关键是在模式的开始使用内联修饰符
(?m)
来设置多行模式(它将使$
正好在换行符(\n
)字符或字符串结尾之前匹配)。由于$
只匹配换行符字符或字符串结尾之前,因此必须允许回车字符\r
,因此需要(?=\r?$)
正向前查找,而不是$
锚,它匹配\r\n
或\n
或字符串结尾之前。要匹配
Total Hours:
和最后一个十进制/整数(无符号)之间的任何文本,您需要使用.*?
模式,而不是其贪婪的对应物.*
,因为它会“吃掉”与\d*\.?
部分匹配的任何可选字符。(?m)
-一个内联修饰符,使$
匹配换行符、LF、char之前的位置(?<=Total Hours:.*?)
-一个正向后查找,它匹配紧接在Total Hours:
前面的位置,以及除换行字符以外的任何零个或多个字符,尽可能少\d*
-零位或多位\.?
-可选的.
字符\d+
-一个或多个数字(?=\r?$)
-一个积极的前瞻,匹配一个位置,紧跟着一个可选的回车字符,然后是一个换行符字符或字符串结束。