尝试将RegEx与由promise返回的文本进行匹配 – 获取空string

我正在使用PDF.js从PDF获取文本,然后使用RegEx进行parsing。 parsetext函数接受一个由promise返回的text参数:

  gettext: function(url){ var self = this; var data = url; console.log('attempting to get text'); return pdfjs.getDocument(data).then(function(pdf) { var pages = []; for (var i = 0; i <= 1; i++) { pages.push(i); } return Promise.all(pages.map(function(pageNumber) { return pdf.getPage(pageNumber + 1).then(function(page) { return page.getTextContent().then(function(textContent) { return textContent.items.map(function(item) { return item.str; }).join(' '); }); }); })).then(function(pages) { return pages.join("\r\n") }); }).then(function(pages){ self.parsetext(pages); }); }, parsetext: function(text){ var rx = /Seite((\S+)\s+\S.*?)(?=\s*\2)/; var s = text; var m = s.match(rx) || ["", ""]; console.log(m[1] + ' is the matched text'); // returns ' is the matched text' } 

m[1]应该返回一个很长的string。

去除了涉及试图从String.match()捕获组的情况下的混淆案例,当没有捕获的组被使用 – 主要的问题仍然没有解决,所以这是不重复的。

问题在哪里起源? 正则expression式看起来很好,所以我只能想象这是gettextparsetext运行之前不返回完整string的结果。 但是,这不是诺言所保证的吗?

我不认为这是没有返回值的问题,因为倒数第二个承诺是返回一个string。 为了certificate这一点,我添加了一个console.log来显示正在返回的内容:

  gettext: function(url){ var self = this; var data = url; console.log('attempting to get text'); return pdfjs.getDocument(data).then(function(pdf) { var pages = []; for (var i = 0; i <= 1; i++) { pages.push(i); } return Promise.all(pages.map(function(pageNumber) { return pdf.getPage(pageNumber + 1).then(function(page) { return page.getTextContent().then(function(textContent) { return textContent.items.map(function(item) { return item.str; }).join(' '); }); }); })).then(function(pages) { return pages.join("\r\n") }); }).then(function(pages){ self.parsetext(pages); }); }, parsetext: function(text){ console.log(text + ' is the text that is being returned from the promise'); var rx = /Seite((\S+)\s+\S.*?)(?=\s*\2)/; var s = text; var m = s.match(rx) || ["", ""]; console.log(m[0] + ' is the matched text'); } 

这logging:

 '...SeiteSGP0136.1 3SE7120 3SE7120-1BF00 SGP0137.1 3SE7140 3SE7140-1CD00 SGP0138.1 3SE7150 3SE7150-1BH00 SGP0136.1 is the text that is being returned from the promise' 

只是为了表明RegEx没有被破坏:

https://jsfiddle.net/dqewqwvk/5/

感谢@ async5的build议,我能够解决这个问题,首先注意到与正则expression式匹配的文本不是我认为的那样

 console.log(JSON.stringify(text)); // '...Seite SGP0136.1...' 

这表明我在Seite插入了额外的空格,这正在破坏我的正则expression式。

我的解决scheme是用空stringreplace多于三个空格的序列:

  var rx = /Seite((\S+)\s+\S.*?)(?=\s*\2)/; var s = text.replace(/\s{3}\s+/g, ''); var m = s.match(rx) || ["", ""]; console.log(m[1] + ' is the matched text');