使用正则表达式在一个子字符串中查找多个项目

时间:2013-03-05 18:55:57

标签: c# regex text substring

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

*我有一个法案,我试图阅读使用正则表达式的信息。我将所需的信息保存到4个不同的表中:帐户,实用程序,位置和税。

逻辑是每个账单只有一个账号(账户级别)。每个帐号都可以与多个实用程序(实用程序级别)相关。每个实用程序可以有多个位置(此问题仅假设一个位置)。并且每个地点可以有多个税。*

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

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

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

以下是我迄今为止电税的例子: (?:电子商务服务(?:。 \ n)?。 ?税:。* \ $(。)(?:。 \ n)?。?此服务的总收费)*

正如您所看到的,这只能获得第一笔税。我无法想办法让它在“电子商务服务”和“电力服务总收费”这两个字之间征收所有税款。

谢谢!

2 个答案:

答案 0 :(得分:1)

在大多数语言中,您无法在单个正则表达式中执行此操作。捕获组只会在匹配数组中生成一个元素,即使该组是通配符也是如此。

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

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

查找所有税款。在PHP中,您将使用preg_match_all来查找此匹配的所有匹配项;其他语言应具有可比性(可能涉及正则表达式的g修饰符)。

答案 1 :(得分: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等同意。