我需要按以下格式拆分数据:
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?(?![0-9]{1,2}[A-Za-z]{1,3}[0-9]{2})([0-9A-Z-\/ .]*)
部分?
一种方法是强制要求\ n char。我现在有可选项,否则会阻止所有匹配。它可能是前瞻的一部分吗?
正则表达式的一部分是否检查下一行是否包含正确的日期? >
{{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))