2

为我的问题想出一个合适的标题是很困难的。首先是一些背景信息,以备不时之需。

*我有一个账单,我试图从使用正则表达式中读取信息。我将需要的信息保存到 4 个不同的表中:帐户、公用事业、位置和税。

逻辑是每张账单只有一个帐号(帐户级别)。每个帐号可以属于多个实用程序(实用程序级别)。每个实用程序可以有多个位置(假设此问题只有 1 个位置)。每个位置可以有多个税。*

因此,对于此处 找到的账单,我们可以看到 4 种税(城市销售税 2.97、县销售税 1.46、州销售税 3.44 和 PPRTA 税 1.10)都属于“电力”公用事业。我们还看到 4 个公用事业(电力、燃气、水和废水)属于 1 个帐号,每个帐号都有自己的税费。

以前我一直在做这样简单的事情来多次捕获一个捕获组中的所有税收:税收:。 \$(. )

我现在想要完成的是构建一个正则表达式,它仅查找给定实用程序的所有税款。同样,它必须在一个具有多个匹配项的捕获组中。

这是迄今为止我对电税的一个示例:(?:Electric Commercial Service(?:. \n) ?. ?Tax:.* \$(. )(?:. \n) ?. ?此项服务的总费用)*

如您所见,这仅收取第一笔税款。我想不出一种方法来让它在“电力商业服务”和与电力服务有关的“这项服务的总收费”这两个词之间征收所有税款。

谢谢!

4

2 回答 2

1

在大多数语言中,你不能用一个正则表达式来做到这一点。一个捕获组只会产生匹配数组中的一个元素,即使该组是通配符。

您需要分两步完成。首先使用正则表达式(或其他方式)提取单个实用程序的账单部分。然后在该字符串中,您可以使用正则表达式

Tax:.* \$([\d.]+)$

找到所有的税。在 PHP 中,您将使用它preg_match_all来查找所有匹配项;其他语言应该有类似的东西(可能涉及g到正则表达式的修饰符)。

于 2013-03-05T19:06:42.467 回答
1

它可以作为单线完成,这样做很有趣,但它变得丑陋:

Gas Commercial Service \([\S\s]+?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?

在这里解释演示:http ://regex101.com/r/fI7hU9

Electric只需更改第一个单词

更新为接受SurTax和喜欢。

于 2013-03-05T20:33:47.393 回答