使用正则表达式在一个子字符串中查找多个项
本文关键字:字符串 查找 一个 正则表达式 | 更新日期: 2023-09-27 18:02:37
为我的问题想出一个合适的标题是很困难的。先说一点背景资料,以防你需要。
*我有一个账单,我正在尝试使用正则表达式读取信息。我将需要的信息保存在4个不同的表中:Account, Utility, Location和Taxes。
逻辑是每个账单只有一个账号(账户级别)。每个帐号可以属于多个实用程序(实用程序级别)。每个实用程序可以有多个位置(本问题假设只有一个位置)。每个位置可以有多个Tax.*
所以对于这里找到的账单我们可以看到4种税(城市销售税2.97,县销售税1.46,州销售税3.44,PPRTA税1.10)都属于"电力"公用事业。我们还看到4种公用事业(电、气、水和废水)属于1个账号,每个账号都有自己的税。
以前我一直在做一些简单的事情,像这样在一个捕获组中捕获所有的税,多次:Tax:。 '(美元。)
我现在想要完成的是建立一个正则表达式,该正则表达式只能为给定的公用事业找到所有的税。同样,它必须在一个具有多个匹配的捕获组中。
这是我目前为止关于电力税的一个例子:(?:电子商业服务(?):。 ' n) ?。 ?税:。* '(美元。)(?:。 ' n) ?。 ?此服务总收费)*
可以看到,这只选取了第一个税。我想不出一个办法来把"电子商务服务"answers"此项服务的总费用"这两个词之间的每一项税都计算在内。
谢谢!
在大多数语言中,您无法在单个正则表达式中完成此操作。捕获组只会在匹配数组中产生一个元素,即使该组是通配符。
你需要分两步来做。首先使用regexp(或其他方法)提取单个实用程序的账单部分。然后在该字符串中,您可以使用正则表达式
Tax:.* '$(['d.]+)$
找到所有的税。在PHP中,您将使用preg_match_all
来查找此的所有匹配;其他语言应该有类似的东西(可能涉及到正则表达式的g
修饰符)。
这可以用一行代码完成,这很有趣,但它变得很难看:
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
和类似的