当一个组有匹配时,正则表达式与最终组不匹配

时间:2018-05-21 14:44:18

标签: php regex

我需要按以下格式拆分数据:

22Dec17 DEB ACME 16.27
22Dec17 DEB BIG CO STORE 50.33
123353443
22Dec17 FEE CHARGE NAME 39.91 DR
123434454
22Dec17 DEB NAMENAME 12.91 123.23
22Dec17 DEB NAME 6 91

在上面的例子中,前两行数据是:

22Dec17, DEB, ACME, 16.27,
22Dec17, DEB, BIG CO STORE, 50.33, 123353443
22Dec17, FEE, CHARGE NAME, 39.91, 123434454
22Dec17, DEB, NAMENAME, 12.91,
22Dec17, DEB, NAME, 6 91,

我正在使用以下主要使用的正则表达式:

([0-9]{1,2}[A-Za-z]{1,3}[0-9]{2}) ([A-Z]{2,3}) ([A-Za-z.,\/& ]*) ?([0-9.]{1,8}[\. ][0-9.]{2})? ?(?:[0-9.]{1,8}[\. ][0-9.]{2})?\n?(?![0-9]{1,2}[A-Za-z]{1,3}[0-9]{2})([0-9A-Z-\/ .]*)

当名称中有数字时会出现问题,如下所示:

27Dec15 DEB TESCO UPT 123 34.90

这会创建正则表达式结果:

27Dec15, DEB, TESCO UPT, 123 34, .97

如果这个数字是最后两个值的一部分,我如何才能使这个数字匹配?如果它的格式仅为12 3412.34,并且知道123 34.90中的123 34并不考虑该匹配的.90\n?(?![0-9]{1,2}[A-Za-z]{1,3}[0-9]{2})([0-9A-Z-\/ .]*) 部分?

一种方法是强制要求\ n char。我现在有可选项,否则会阻止所有匹配。它可能是前瞻的一部分吗?

正则表达式的一部分是否检查下一行是否包含正确的日期? >

{{1}}

1 个答案:

答案 0 :(得分:0)

/(\d{0,2}[a-z]{3}\d{0,2})\s([^.]+)\s([\d.]+)[\n]?(\d+\s)?/gi

这个正则表达式应该得到你所追求的,在代码示例中演示。您只需要稍后清理换行符。 击穿:

  • (\d{0,2}[a-z]{3}\d{0,2})\s匹配日期块,后跟空格
  • ([^.]+)\s获取公司名称,以便任何不是.的字符,后跟必填字符
  • ([\d.]+)获取费用
  • [\n]?(\d+\s)?可选择抓取额外的数字行(如果存在)

var teststrs = `22Dec17 DEB ACME 16.27
22Dec17 DEB BIG CO STORE 50.33
123353443
22Dec17 FEE CHARGE NAME 39.91 DR
123434454
22Dec17 DEB NAMENAME 12.91 123.23
22Dec17 DEB NAME 6 91`

var rgx = /(\d{0,2}[a-z]{3}\d{0,2})\s([^.]+)\s([\d.]+)[\n]?(\d+\s)?/gi

console.log(teststrs.match(rgx))