使用RegExp筛选价格收据

时间:2018-11-09 09:21:29

标签: javascript regex

通过程序,我希望能够对任何收据进行图片处理并过滤某些信息,其中一个就是价格。

我的输入如下:

输入:

----------
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:

首先,我尝试了以下RegExp:

/(([\d]{1,2})(\,|\.)[\d]{2})/g

我选择这个,是因为

  • 我正在寻找多个比赛,因此/

    (...)/ g

    • 我的价格开始时只有一两位数字,因此[\d]{1,2}
    • 在第一个数字之后,是点或逗号,因此(\,|\.)
    • 最后有两位数字,因此[\d]{2}

I got this output

如您所见,部分日期是一场比赛,我不想要。 现在,我不介意MWST Netto之后的比赛。

我解决问题的方法

我的想法是寻找圆点。所以我尝试添加 我的RegExp之前和之后的[^。]

Then I got this output

您可以看到我的问题仍然存在。我不明白为什么6,40和6,71不再匹配,因为之前或之后都没有点。

有人知道下一步该怎么做吗?我当时在考虑和 AND-Statement ,所以我将使用我的第一个RegExp,然后排除任何看起来像日期的东西。 但是我不确定该怎么做。

如果您有任何建议或想法,我将不胜感激。如果有任何不清楚的地方或您需要更多信息,请随时询问。

2 个答案:

答案 0 :(得分:1)

您可以使用

/(?:^|[^.\d])(\d{1,2}[,.]\d{2})(?![.\d])/g

并获取第1组的内容。请参见the regex demo

详细信息

  • (?:^|[^.\d])-字符串或.和数字以外的任何字符的开头
  • (\d{1,2}[,.]\d{2})-组1:1或2位数字,.,,两位数
  • (?![.\d])-不允许.或紧靠右边的数字。

JS demo

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位数字

Regex demo

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]);
  }
}