JavaScript RegEx Как динамически извлечь подстроку - PullRequest
1 голос
/ 07 ноября 2019

Мне нужно извлечь подстроку внутри динамического ввода, я добился нужного результата, но это только чистый жесткий код, поэтому он не такой динамичный и надежный. Есть ли какой-нибудь другой способ извлечь части "B1003 = Техническая визитная карточка" (Описание изделия) и "2" (Количество), оба они динамические, может быть введен совершенно другой элемент, такой как;«O1003 = Карандаш», «O1004 = Липкие заметки». Есть ли способ закодировать это в регулярном выражении, который позволил бы сделать более надежный код?

Входные данные, которые читаются здесь, взяты из извлеченного текста с использованием Tesseract OCR, мне нужно извлечь необходимую информацию и передать ее в другой сервис.

var requisition = `Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 B1003 = Engineering Business Card Business Cards 2 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 O1003 = Pencil Office Supplies 5 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
`;

//rule 1 - Gets all Items + Quantity
//rule 2 - Gets all Items
//rule 3 - Gets all Quantity
//resultArray - Contains Quantity + Item e.g. 2 B1003 Engineering Business Cards

var rule1 = /(B1002 = Accountant Business Card|B1003 = Engineering Business Card|B1001 = Sales and Marketing Business Card|O1001 = Black Ballpen Branded Panda Regular with Eraser|O1002 = Notebook|O1003 = Pencil|O1004 = Stick Notes) (.*) ([0-9]|[0-9][0-9]|[0-9][0-9][0-9])/
var rule2 = /(B1002 = Accountant Business Card|B1003 = Engineering Business Card|B1001 = Sales and Marketing Business Card|O1001 = Black Ballpen Branded Panda Regular with Eraser|O1002 = Notebook|O1003 = Pencil|O1004 = Stick Notes)/
var rule3 = /([0-9]|[0-9][0-9]|[0-9][0-9][0-9])/

var resultarray = []

var stringarray = requisition.split("\n")
stringarray.forEach(element => {
    var result = element.match(rule1)
    if (result!=null){
        var itemName = result[0].match(rule2)
        var quantity = result[0].match(rule3)
        resultarray.push (quantity[0]+ " " + itemName[0])
    }
});

console.log (resultarray.join(", "))

Примечание: просто чтобы прояснить ситуацию, это изображение, из которого я извлек текст Условные обозначения: синий - статический без коробки - динамический желтый -Текст, который нужно извлечь (также динамический)

- Это изображение извлечено, первая строка статическая , вторая строка динамическая

Ожидаемый результат 2 B1003 = Инженерная визитная карточка (, B1002 = Визитная карточка бухгалтера - будет выводиться, если в коде есть подобный элемент) Пожалуйста, проверьте комментарии к переменной заявки .

Опять же, я уже могу получить желаемый результат, Мне просто нужно знать, как код может быть выполнен по-другому, более динамично и надежно, используя RegEx . Пожалуйста, потерпите меня, так как я не знаю много о RegEx. Спасибо!

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Краткий ответ:

var requisition = `Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 B1003 = Engineering Business Card 2 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 O1003 = Pencil Office Supplies 5 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
`;

//rule 1 - Gets all Items + Quantity
//rule 2 - Gets all Items
//rule 3 - Gets all Quantity
//resultArray - Contains Quantity + Item e.g. 2 B1003 Engineering Business Cards

var rule1 = /(B1002 = Accountant Business Card|B1003 = Engineering Business Card|B1001 = Sales and Marketing Business Card|O1001 = Black Ballpen Branded Panda Regular with Eraser|O1002 = Notebook|O1003 = Pencil|O1004 = Stick Notes)[^\d]+(\d+) .*/

var resultarray = []

var stringarray = requisition.split("\n")
stringarray.forEach(element => {
    var result = element.match(rule1)
    if (result!=null){
        var itemName = result[1]
        var quantity = result[2]
        resultarray.push (quantity + " " + itemName)
    }
});

console.log (resultarray.join(", "))

Вывод:

2 B1003 = Engineering Business Card, 5 O1003 = Pencil

Длинный ответ:

Есть много вещей, которые нужно исправить:

  1. Используйте только правило 1 (после некоторых изменений), чтобы сопоставить все (наименование и количество товара), используя (\ d +)
  2. Избавьтесь от правила 2 и 3
  3. Используйте результат [1] в качестве элементаимя и результат [2] как количество

Обратите внимание, что все ваши поля разделены пробелами и поля могут содержать пробелы, поэтому ваши данные не структурированы. Было бы намного надежнее, если бы у вас был, например, файл с разделителями табуляции. Таким образом, правило, которое я использовал, чтобы найти количество: «игнорируйте все после названия продукта, пока не появится число», но если однажды у вас будет категория, содержащая число, вы застрянете и ничего не сможете сделать безструктурированный файл

0 голосов
/ 07 ноября 2019

Вы можете поместить все это в одно регулярное выражение и захватить quantity в одной группе и itemName в другой. Затем извлеките эти группы из совпадения (если есть совпадение):

var requisition = `Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 B1003 = Engineering Business Card Business Cards 2 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 O1003 = Pencil Office Supplies 5 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
`;

var rule = /(B1002 = Accountant Business Card|B1003 = Engineering Business Card|B1001 = Sales and Marketing Business Card|O1001 = Black Ballpen Branded Panda Regular with Eraser|O1002 = Notebook|O1003 = Pencil|O1004 = Stick Notes).*(\d{1,3})/

var resultarray = []

var stringarray = requisition.split("\n")
stringarray.forEach(element => {
  const match = element.match(rule);
  if (match) {
    const [, itemName, quantity] = match;
    resultarray.push(quantity + ' ' + itemName);
  }
});

console.log(resultarray)

Для более минимального примера:

const input = `Lines
foo 1
bar 2
baz don't match`;
const pattern = /(foo|bar) (\d+)/;
const output = [];
input
  .split('\n')
  .forEach((line) => {  
    const match = line.match(pattern);
    if (match) {
      const [, itemName, quantity] = match;
      output.push(quantity + ' ' + itemName);
    }
  });
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...