Javascript-使用matchAll()

时间:2019-12-11 20:48:16

标签: javascript regex

我不确定自己在做什么错,我很高兴承认javascript不是我最强的语言。我在几年前写的一个小型.net测试仪中测试了我的正则表达式,但我发现那里没有问题。我知道不同的语言对regex的实现会有一些不同,但是我认为这不是问题所在。

我的应用程序有一个文本区域,我可以在其中粘贴特定行业电子表格中的数据,并使用regexp matchAll()进行解析。我通过for / of循环遍历matchAll返回的可迭代项,这是非常基本的东西,并且注意到我似乎无法获得第一个比赛。因此,如果我的电子表格包含15行数据,则我的javascript解析会忽略2号行,而忽略#1行。如果我复制块中的任何行并将其粘贴到开头,则新行#1将被忽略,而现在的旧#1(现在是#2)将被解析,始终忽略第一行。因此,问题显然不是RegExp模式。我在Google上搜索了一下,发现这段内容来自于developer.mozilla.org:

  

matchAll仅在缺少/ g标志的情况下返回第一个匹配项

这对我说,如果我拿出/ g,我只会得到第一个比赛,但是我想这句话也可以理解为

  

除非缺少/ g标志,否则matchAll将不会返回第一个匹配项

但是那太荒谬了,对吧?如果我取出/ g,则会得到第一个匹配项,并且只有第一个匹配项。如果我使用/ g,则匹配2-15。为什么我不能得到1-15?我从几个月前制作的另一个应用程序中复制了一些代码,但没有出现这个问题。

工作代码:

var patt = /(?<invoiceNumber>INV \d+)\t(?<vendor>[\w  .,&-]+)\t(?<vendInvNum>[ ()\w\d\/.-]+)\t(20)?(?<yr>\d{2})[-\/](?<mn>\d{1,2})[-\/](?<dd>\d{1,2})\tInvoice\sUSD\s+(?<invAmt>[\d,.-]+)/g

for (let result of objInp.value.matchAll(patt)){
    //loops thru iterable
}

粘贴数据的示例,在3个匹配项中找到3个:

INV 006015  VENDOR 1    1025702 26/08/2019  Invoice USD  580.69 
INV 006019  VENDOR 2    STORE/090919    09/09/2019  Invoice USD  38.71 
INV 006021  Vendor 3    170241569   10/09/2019  Invoice USD  1,080.64 

无法插入首个匹配项的代码:

var patt = /\s(?<actID>[\w\d-]+)\t(?<actDesc>[\w\d  .,&\(\)-]+)?\t(?<origDur>[\d]+)?\t(?<start>[-\d\w]+)?\t(?<end>[-\d\w]+)?/g

for (let result of objInp.value.matchAll(patt[x])){
    //loops through but always misses the first match
}

粘贴数据的示例,在3个匹配项中找到2个:

Activity ID Activity Name   Original Duration   Start   Finish  Variance - BL1 Finish Date  BL1 Finish  Total Float
        S600-20-21  Executive Steering Committee    5   06-Jan-20   13-Jan-20   0   13-Jan-20   0
        S600-20-31  Steering Committee - Option Selection Meeting   2   13-Jan-20   15-Jan-20   0   15-Jan-20   0
        S600-20-019b10  Resource Center of Excellence- Review   20  15-Jan-20   12-Feb-20   0   12-Feb-20   0

0 个答案:

没有答案