【发布时间】:2017-10-15 02:53:31
【问题描述】:
我正在使用 PDF.js 从 PDF 中获取文本,然后使用 RegEx 对其进行解析。 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.match() 获取捕获组的混淆案例 - 主要问题仍未解决,因此没有重复。
问题可能出在哪里? RegEx 看起来不错,所以我只能想象这是 gettext 在运行 parsetext 之前没有返回完整字符串的结果。但这不是承诺所保证的吗?
我不认为这是没有返回值的问题,因为倒数第二个承诺是返回一个字符串。为了证明这一点,我添加了一个 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 没有被破坏:
【问题讨论】:
-
@JaromandaX 不 .
then(function(pages) { return pages.join("\r\n") });返回文本,然后将其发送到self.parsetext? -
当你尝试硬编码时,你使用的正则表达式不会对任何东西进行分组。正则表达式匹配成功,但由于结果仅包含您从
m[1]获得的undefined的完整匹配项,因为m只有一个项目 -
@DavidJ.,因为您在该正则表达式中有一个捕获组(即括号):
((\S+)\s+\S.*?)。该子表达式捕获的部分存储在m[1]中。在这种情况下,还有m[2]对应于嵌套组(\S+)匹配的内容。 -
@trincot:我可以建议你放弃这个吗?问题不是异步编程的问题。 OP 甚至记录/解释了文本正在进入
parsetext函数。 -
PDF可能包含其他控制字符,请使用
JSON.stringify(text)记录内容
标签: javascript node.js regex promise pdf.js