我不确定自己在做什么错,我很高兴承认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