0

Trying to create a forgiving regex for email address parsing, and so far I have

var regex = /(?:"?([A-Z][^<"]+)"?\s*)?<?([^>\s,]+)/gi;
var ip='"Bob Smith" <bob@company.com>, <joe@company.com>, "John Doe <john@company.com>, foo Bar <foo@company.com>, <abcd@efg.com>, Ln, Fn<fnln@domain.com>,"Mn, Gn"<gnmn@domain.com>,Nn, Hn <hnnn@domain.com>, bar@gmail.com, Rum@bacardi.com, In,On <onin@example.com>';
while (m = regex.exec(ip)) {
if (m[1]) {
    m[1] = m[1].trim()
}
extracts.push({
    name: m[1]?m[1]:m[2].replace(/@.*/,""),
    email: m[2]
});

which matches the following,

"Bob Smith" <bob@company.com>, <joe@company.com>, "John Doe <john@company.com>, foo Bar <foo@company.com>, <abcd@efg.com>, Ln, Fn<fnln@domain.com>,"Mn, Gn"<gnmn@domain.com>,Nn, Hn <hnnn@domain.com>

but misses these,

bar@gmail.com, Rum@bacardi.com, In,On <onin@example.com>

The code

function paintExtracts(extracts) {
  var html = '<table border="1"><thead><tr><td>Name</td><td>Email</td></tr></thead><tbody>';
  for (var i = 0; i < extracts.length; i++) {
    html += '<tr><td>"' + extracts[i].name + '"</td><td>"' + extracts[i].email + '"</td></tr>';
  }
  html += '</tbody></table>';
  $('#opdiv').html('').append(html);
}
var regex = /(?:"?([A-Z][^<"]+)"?\s*)?<?([^>\s,]+)/gi
$('#parsebtn').click(function() {
  var extracts = [];
  var ip = $('#inputta').val();
  while (m = regex.exec(ip)) {
    if (m[1]) {
      m[1] = m[1].trim()
    }
    debugger;
    extracts.push({
      name: m[1]?m[1]:m[2].replace(/@.*/,""),
      email: m[2]
    });
  }
paintExtracts(extracts);
});
table {
  font-family: monospace;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="inputta" rows="12" cols="65">"Bob Smith" <bob@company.com>, <joe@company.com>, "John Doe <john@company.com>
foo Bar <foo@company.com>, <abcd@efg.com>,
</textarea>
<p>
  <input type="button" id='parsebtn' value="Parse"></input>
  <div id="opdiv">
    <h1>
  Parsed Data
  </h1>
  </div>
Sagar V
  • 12,158
  • 7
  • 41
  • 68
Anand Rockzz
  • 6,072
  • 5
  • 64
  • 71
  • May be worth you checking out this previous post: [link](https://stackoverflow.com/questions/46155/validate-email-address-in-javascript?rq=1) It may have some of the answers you need. – Tufty Mar 21 '17 at 08:23
  • Will [this](https://regex101.com/r/nwGks2/1) do? Or do you want to get precise group values? – Wiktor Stribiżew Mar 21 '17 at 09:21
  • Thank you folks. Expanded the second capturing group as follows, with the risk of spl domain names, but that's OK. (?:"?([A-Z][^<",]+)"?\s+?)?([^<",]+@[a-z0-9]+.[^>",]+) – Anand Rockzz Mar 21 '17 at 13:54

0 Answers0