Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当一个组匹配时,正则表达式不匹配最终组_Php_Regex - Fatal编程技术网

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

Php 当一个组匹配时,正则表达式不匹配最终组,php,regex,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,

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

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 34 < /代码>或<代码> 12.34 <代码>时,并且知道在<代码> 123 34.90 < /代码>中不考虑<代码> 123 34 < /代码>和<>代码> 90 < /代码>匹配的部分>

一种方法是强制需要\n字符。我现在有它的可选性,否则它会阻止所有匹配。这可能是前瞻的一部分吗

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

\n?(?![0-9]{1,2}[A-Za-z]{1,3}[0-9]{2})([0-9A-Z-\/ .]*)
/(\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=`2017年12月22日DEB ACME 16.27
2017年12月22日DEB BIG CO商店50.33
123353443
2017年12月22日费用名称39.91 DR
123434454
2017年12月22日DEB姓名12.91 123.23
2017年12月22日DEB姓名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))
那么您想要的是
27Dec15,DEB,TESCO UPT,12334.90
?我想要
27Dec15,DEB,TESCO UPT 123,34.90
,或者干脆放弃123并返回
27Dec15,DEB,TESCO UPT,34.90
。重点是,123是名称列的一部分,只有34.90是该列的一部分……在第一个示例中,您对
22Dec17 DEB NAMENAME 12.91 123.23
也有同样的问题?轮到我了:(对名称部分使用贪婪子模式)。当它的格式为12 34或12.34时,这是一个问题
,其中
6 91
是什么,是名称的一部分还是编号?谢谢,但不幸的是,这没有返回匹配项。不确定为什么会出现这种情况,对我来说很好,包括在文章中,如果您运行代码段。我想可能是php对其中的某些内容有不同的解释