尝试将RegEx与promise返回的文本进行匹配 - 获取空字符串

时间:2017-05-16 06:56:54

标签: javascript node.js regex promise pdf.js

我正在使用PDF.js从PDF获取文本,然后我使用RegEx进行解析。 parsetext函数接受一个承诺返回的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.match()获取捕获的组 - 主要问题仍然没有解决,所以这没有重复。

问题可能来自哪里? RegEx看起来很好,所以我只能想象这是gettextparsetext运行之前没有返回完整字符串的结果。但这不是承诺所确保的吗?

我不认为这是没有返回值的问题,因为倒数第二个答案是返回一个字符串。为了证明这一点,我添加了一个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');
 }

此日志:

'...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/

1 个答案:

答案 0 :(得分:1)

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

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

向我展示Seite之后插入了额外的空格,这打破了我的正则表达式。

我的解决方案是用空字符串替换三个以上空格的序列:

     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');