使用正则表达式提取数据

时间:2019-02-02 10:00:28

标签: regex typescript

我想提取产品名称和价格。产品名称和价格的兽人结果不在同一行。那么如何在价格之前加入行?

收据中产品的样本结构:

RETAIL
UPRICE QTY TOTAL
ILLUSTRATION BOARD 15X20 (1/4 SIZE ) BY
1276
12.50 1.0 12.50
MONGOL PENCIL 1,2,3 PC
434
6.50 1.0 6.50
MS 300 (MGK) PERMANENT MARKER
1470
3.75 1.0 3.75
HBW White Glue 40 grans
1690
10.00 1.0 10.00
COLOR PEN 8 COLORS (VARIOUS BRAND)
1930
16.50 1.0 16.50
KS /CREATION CONSTRUCTION PAPER (105)
3503
23.00 1.0 23.00

这是我尝试过的正则表达式,但结果不包括产品名称,仅包括价格。 this.result包含收据中的数据(上面给出的样本)

ts文件

   this.result = {
      merchant: text.split("\n")[0],
      product: text.split("\n").filter(t => t.match(/([\w\s]+)(\d+\.\d{2})/))
   };

html文件

 <ion-card *ngIf="result">
    <ion-card-content>
      <p>Results:</p>
      <ion-item>
        <ion-label>Merchant</ion-label>
        <ion-input type="text" value="{{result.merchant}}"></ion-input>
      </ion-item>
      <ion-item *ngFor="let product of result.product; let i = index">
        <ion-label>Product #{{i+1}}</ion-label>
        <ion-input type="text" value="{{product}}"></ion-input>
      </ion-item>
    </ion-card-content>
  </ion-card>

1 个答案:

答案 0 :(得分:0)

您可能会做什么让你的结果是一组2捕获2次任意字符跟着一个换行符,然后捕获的价格在一组。

(.+\n.+\n)(\d+\.\d{1,2})

Regex demo

说明

  • (.+\n.+\n)捕获一个匹配2个1+个字符并后跟换行符的组
  • (\d+\.\d{1,2})捕获一组匹配1+个数字,后跟一个点和1+个数字

例如:

const regex = /(.+\n.+\n)(\d+\.\d{1,2})/g;
let products = [];

while ((m = regex.exec(str)) !== null) {
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    products.push([m[1].replace(/\n/g, ''), m[2]]);
}

let str = `RETAIL
UPRICE QTY TOTAL
ILLUSTRATION BOARD 15X20 (1/4 SIZE ) BY
1276
12.50 1.0 12.50
MONGOL PENCIL 1,2,3 PC
434
6.50 1.0 6.50
MS 300 (MGK) PERMANENT MARKER
1470
3.75 1.0 3.75
HBW White Glue 40 grans
1690
10.00 1.0 10.00
COLOR PEN 8 COLORS (VARIOUS BRAND)
1930
16.50 1.0 16.50
KS /CREATION CONSTRUCTION PAPER (105)
3503
23.00 1.0 23.00`;

const regex = /(.+\n.+\n)(\d+\.\d{1,2})/g;
let products = [];

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  products.push([m[1].replace(/\n/g, ' '), m[2]]);
}

console.log(products);