Home > database >  Parsing text using regex javascript
Parsing text using regex javascript

Time:12-23

guys i am stuck while parsing following text into object. I have created two separate regex but i want to make only one. Below i am posting sample text as well as my following regex pattern.

PAYER:\r\n\r\n   MCNA \r\n\r\nPROVIDER:\r\n\r\n   MY KHAN \r\n   Provider ID: 115446397114\r\n   Tax ID: 27222193992\r\n\r\nINSURED:\r\n\r\n   VICTORY OKO\r\n   Member ID: 60451158048\r\n   Birth Date: 05/04/2009\r\n   Gender: Male\r\n\r\nCOVERAGE TYPE:\r\n\r\n   Dental Care

REGEX:

 re = new RegExp('(.*?):\r\n\r\n(.*?)(?:\r\n|$)', 'g');
re2 = new RegExp('(.*?):(.*?)(?:\r\n|$)', 'g');

Expected result:

{
  payer: 'MCNA',
  provider: 'MY KHAN'
}

CodePudding user response:

This turns your input into an object that contains all key/value pairs:

const input = 'PAYER:\r\n\r\n   MCNA \r\n\r\nPROVIDER:\r\n\r\n   MY KHAN \r\n   Provider ID: 115446397114\r\n   Tax ID: 27222193992\r\n\r\nINSURED:\r\n\r\n   VICTORY OKO\r\n   Member ID: 60451158048\r\n   Birth Date: 05/04/2009\r\n   Gender: Male\r\n\r\nCOVERAGE TYPE:\r\n\r\n   Dental Care';

let result = Object.fromEntries(input
  .replace(/([^:] ):\s ([^\n\r] )\s*/g, (m, c1, c2) => c1.toLowerCase()   '\r'   c2   '\n')
  .split('\n')
  .filter(Boolean)
  .map(item => item.trim().split('\r'))
);
console.log(result);

Output:

{
  "payer": "MCNA",
  "provider": "MY KHAN",
  "provider id": "115446397114",
  "tax id": "27222193992",
  "insured": "VICTORY OKO",
  "member id": "60451158048",
  "birth date": "05/04/2009",
  "gender": "Male",
  "coverage type": "Dental Care"
}

Explanation:

  • Object.fromEntries() -- convert a 2D array to object, ex: [ ['a', 1], ['b', 2] ] => {a: 1, b: 2}
  • .replace() regex /([^:] ):\s ([^\n\r] )\s*/g -- two capture groups, one for key, one for value
  • replace action c1.toLowerCase() '\r' c2 '\n' -- convert key to lowercase, separate key/value pairs with newline
  • .split('\n') -- split by newline
  • .filter(Boolean): -- remove empty items
  • .map(item => item.trim().split('\r')) -- change array item to [key, value], e.g. change flat array to 2D array

You could add one more filter after the .map() to keep only keys of interest.

  • Related