通过程序,我希望能够对任何收据进行图片处理并过滤某些信息,其中一个就是价格。
我的输入如下:
----------
BT em <br/>
SCHWEINFURT _OSKAR-VON-MILLER-STR.6 <br/>
RADIESCHEN **0,59** <br/>
KAESEAUFSCH. **1.39** <br/>
BAUCHSPECK **1,19** <br/>
BAUCHSPECK **1,19** <br/>
DORNFELDER **0,99**<br/>
CLEMENTINEN **2,49**<br/>
L&M BLUE **3,50**<br/>
L&M BLUE **3,50**<br/>
SUMME EUR **14,84** *<br/>
BAR **50,00**<br/>
RUCKGELD EUR **35,16**<br/>
“ENTHALTENE MEHRWERTSTEUER A<br/>
MWST NETTO<br/>
**7,00** % **0,45** **6,40**<br/>
**19,00** % **1,28** **6,71**<br/>
SUMME MWST **1,73** **13,11**<br/>
EDEKA HANDELSGFSELLSCHAFT<br/>
NORDBAYERN-SACHSEN-THURINGEN MBH<br/>
STEUERNUMMER: 257/115/30471<br/>
QUITTUNG<br/>
NUTZEN SIE DIF EDECARD<br/>
PUNKTE_SAMMELN+PRAMIEN ERWERBEN<br/>
THR EINKAUF WARE UNS<br/>
1 BONUSPUNKTE WERT GEWESEN !<br/>
08.12.07 16:27 37589 48 4 8500<br/>
FS BEDIENTE STE: H. SEUFERT :<br/>
VIELEN DANK FÜR IHREN EINKAUF!<br/>
AUF WIEDERSEHEN IM E-CENTER<br/>
UNSERE ÖFFNUNGSZEITEN FÜR SIE:<br/>
MONTAG-SAMSTAG: 0800-20 . 00UER<br/>
我要获取的信息以粗体显示。
首先,我尝试了以下RegExp:
/(([\d]{1,2})(\,|\.)[\d]{2})/g
我选择这个,是因为
我正在寻找多个比赛,因此/
(...)/ g
[\d]{1,2}
(\,|\.)
[\d]{2}
如您所见,部分日期是一场比赛,我不想要。 现在,我不介意MWST Netto之后的比赛。
我的想法是寻找圆点。所以我尝试添加 我的RegExp之前和之后的[^。]
您可以看到我的问题仍然存在。我不明白为什么6,40和6,71不再匹配,因为之前或之后都没有点。
有人知道下一步该怎么做吗?我当时在考虑和 AND-Statement ,所以我将使用我的第一个RegExp,然后排除任何看起来像日期的东西。 但是我不确定该怎么做。
如果您有任何建议或想法,我将不胜感激。如果有任何不清楚的地方或您需要更多信息,请随时询问。
答案 0 :(得分:1)
您可以使用
/(?:^|[^.\d])(\d{1,2}[,.]\d{2})(?![.\d])/g
并获取第1组的内容。请参见the regex demo。
详细信息
(?:^|[^.\d])
-字符串或.
和数字以外的任何字符的开头(\d{1,2}[,.]\d{2})
-组1:1或2位数字,.
或,
,两位数(?![.\d])
-不允许.
或紧靠右边的数字。
var text = "BT em \r\nSCHWEINFURT _OSKAR-VON-MILLER-STR.6 \r\nRADIESCHEN 0,59 \r\nKAESEAUFSCH. 1.39 \r\nBAUCHSPECK 1,19 \r\nBAUCHSPECK 1,19 \r\nDORNFELDER 0,99\r\nCLEMENTINEN 2,49\r\nL&M BLUE 3,50\r\nL&M BLUE 3,50\r\nSUMME EUR 14,84 *\r\nBAR 50,00\r\n\r\nRUCKGELD EUR 35,16\r\n“ENTHALTENE MEHRWERTSTEUER A\r\nMWST NETTO\r\n7,00 % 0,45 6,40\r\n19,00 % 1,28 6,71\r\nSUMME MWST 1,73 13,11\r\nEDEKA HANDELSGFSELLSCHAFT\r\nNORDBAYERN-SACHSEN-THURINGEN MBH\r\nSTEUERNUMMER: 257/115/30471\r\nQUITTUNG\r\nNUTZEN SIE DIF EDECARD\r\nPUNKTE_SAMMELN+PRAMIEN ERWERBEN\r\nTHR EINKAUF WARE UNS\r\n1 BONUSPUNKTE WERT GEWESEN !\r\n08.12.07 16:27 37589 48 4 8500\r\nFS BEDIENTE STE: H. SEUFERT :\r\nVIELEN DANK FÜR IHREN EINKAUF!\r\nAUF WIEDERSEHEN IM E-CENTER\r\nUNSERE ÖFFNUNGSZEITEN FÜR SIE:\r\nMONTAG-SAMSTAG: 0800-20 . 00UER";
var rx = /(?:^|[^.\d])(\d{1,2}[,.]\d{2})(?![.\d])/g;
var m, res = [];
while (m = rx.exec(text)) {
res.push(m[1]);
}
console.log(res);
答案 1 :(得分:1)
一种方法可能是使用替换来匹配您不需要的格式,然后在组中捕获您想要的内容:
\d+\.\d+\.\d+|(\d{1,2}[.,]\d{1,2})
说明
\d+\.\d+\.\d+
您不想捕获的匹配模式(例如,如果您想更具体一点,例如\d{2}\.\d{2}\.\d{2}
)|
或(\d{1,2}[.,]\d{2})
捕获一组1或2位数字,用逗号或点号,然后捕获2位数字
const regex = /\d+\.\d+\.\d+|(\d{1,2}[.,]\d{2})/g;
const str = `BT em
SCHWEINFURT _OSKAR-VON-MILLER-STR.6
RADIESCHEN 0,59
KAESEAUFSCH. 1.39
BAUCHSPECK 1,19
BAUCHSPECK 1,19
DORNFELDER 0,99
CLEMENTINEN 2,49
L&M BLUE 3,50
L&M BLUE 3,50
SUMME EUR 14,84 *
BAR 50,00
RUCKGELD EUR 35,16
“ENTHALTENE MEHRWERTSTEUER A
MWST NETTO
7,00 % 0,45 6,40
19,00 % 1,28 6,71
SUMME MWST 1,73 13,11
EDEKA HANDELSGFSELLSCHAFT
NORDBAYERN-SACHSEN-THURINGEN MBH
STEUERNUMMER: 257/115/30471
QUITTUNG
NUTZEN SIE DIF EDECARD
PUNKTE_SAMMELN+PRAMIEN ERWERBEN
THR EINKAUF WARE UNS
1 BONUSPUNKTE WERT GEWESEN !
08.12.07 16:27 37589 48 4 8500
FS BEDIENTE STE: H. SEUFERT :
VIELEN DANK FÜR IHREN EINKAUF!
AUF WIEDERSEHEN IM E-CENTER
UNSERE ÖFFNUNGSZEITEN FÜR SIE:
MONTAG-SAMSTAG: 0800-20 . 00UER`;
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
if (m[1]) {
console.log(m[1]);
}
}