【发布时间】:2017-04-11 16:40:16
【问题描述】:
我有以下示例文本:
tabela de Preço 18654 TONER XEROX 106R01632 MA(6000/6010 117.90 129.90 18656 TONER XEROX 106R01634 PR 6000/6010 179.00 199.00 UDP COMPUT ADORES IBYTE 32607 UDP A - GCL(CDCP 2.41,2,500) 747.00 829.90 32148 UDP A - GCL(CDCP 2.41,2,500) 747.00 829.90 32149 UDP A - GCL(CDCP 2.41,4,500,DVD) 769.90 879.00 32555 UDP A - GCL(CDCP 2.41,4,500,DVD) 769.90 879.00 32490 UDP A - ICL(CDCP 2.41,2,500) 747.00 829.90 32150 UDP A - ICL(CDCP 2.41,2,500) 747.00 829.90 32024 UDP A - ICW10(CDC 2.8,4,500,DVD) 1 260.001 399.90 32445 UDP A - ICW10(CDC 2.8,4,500,DVD) 1 260.001 399.90 31060 UDP A - ISW10PRO(CDCP 2.41,4,500)SLI1 349.901 549.90 32356 UDP F - GCL(I3 6G 3.7,4,500,DVD,LT) 1 699.001 929.90
并且我必须将其匹配到以下组中:
code, description,value1,value2
使用该摘录作为来源:
"18654 TONER XEROX 106R01632 MA(6000/6010 117.90 129.90"
它是一个产品,我需要按如下方式解析它:
"18654" is the code
"TONER XEROX 106R01632 MA(6000/6010" is the description
"117.90" is the value1
"129.90" is the value2
但描述、value1 和 value2 的长度各不相同,虽然我的产品具有 value1,例如“117.90”,但我也有“1 699.00”和“90.00”。
我正在尝试使用以下正则表达式来捕获组,但它正确匹配了一些而不是整个源字符串:
(?<code>\d{5})\s{1}(?<description>.{20,35})\s{1}(?<value1>\d{2,3}\.\d{2})\s{1}(?<value2>\d{2,3}\.\d{2})
如何使用 pcre (php) 正确捕获此示例源字符串中每个产品的组?
我有以下 regex101.com 网址来显示我尝试过的内容 https://regex101.com/r/Smh2KA/3
提前致谢。
【问题讨论】:
-
您需要解释应该如何识别比赛的不同部分。
-
从来没有必要在正则表达式中写
{1}。这是默认设置,添加它只会让 RE 看起来更复杂。 -
为什么所有数据都在一行?
-
@CasimiretHippolyte 我无法控制数据源。这个字符串来自一个解析/转换为纯文本的pdf,所以一行大字符串
-
@Barmar 我需要的正则表达式应该解析整个输入字符串并捕获如下组:代码是启动产品的 5 个数字固定组。 description 是以下组,前面有 1 个空格字符。 value1 是下一个,可以是“117.90”、“1 699.00”或“90.00”,value2 也是最后一个。然后,序列重复直到输入字符串的结尾