使用正则表达式提取数据

问题描述 投票:0回答:1

我想提取的产品名称和价格。在orc'd结果是产品的名称和价格是不是在同一条线上。那么,如何包括价格前行?

从收到产品样本结构:

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>
regex typescript
1个回答
0
投票

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

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

Regex demo

说明

  • 匹配的2倍1+字符的组中(.+\n.+\n)捕获跟着一个新行
  • 匹配1+数字的组中(\d+\.\d{1,2})捕获后面跟着一个点和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);
© www.soinside.com 2019 - 2024. All rights reserved.