Как извлечь адреса электронной почты и имена из строки и вставить их в таблицу HTML с помощью Regex? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть строка, которая содержит имена (имя и фамилию), имя пользователя и адреса электронной почты лиц.Мне нужно получить имена и адреса электронной почты и добавить их в таблицу HTML с помощью регулярных выражений.

Таблица HTML должна выглядеть следующим образом:

enter image description here

Это мой JavaScript-код:

// this is some example of the names & email adresses - they are fake
const outlook = "Anders Jensen (EAAAANJE) <eaaaanje@students.eaax.dk>; Bodil Pedersen (EAAABOPE) <eaaabope@students.eaax.dk>; Åse Andersen (EAAAIDAN) <eaaaasan@students.eaax.dk>; Mühl Svendsen (EAAAPESV) <eaaamusv@students.eaax.dk>";

// we find all the emails & names of the students
let regexEmail = /\<.*?\>/g;
let regexName = /\w+\s\w+\s/gi;

// an array of all the td-tags
let tdTags = document.querySelectorAll("td");

// The emails and names are inserted in the table
for(let i = 0; regexName.exec(outlook) !== null; i++) {

    tdTags[i].innerHTML = regexName.exec(outlook)[i]; // name
    tdTags[i].nextSibling.innerHTML = regexEmail.exec(outlook)[i]; // e-mail
}

Проблема в том, что он печатает только одно имя и вставляет его в первый тд.И адреса электронной почты не могут быть восстановлены.Я все еще новичок в Regex, поэтому я не вижу, что я делаю неправильно.

Любая помощь будет признательна!

Ответы [ 4 ]

0 голосов
/ 01 марта 2019

Я знаю, что ваш вопрос говорит о регулярных выражениях, но я бы просто использовал старый добрый split:

// this is some example of the names & email adresses - they are fake
const outlook = "Anders Jensen (EAAAANJE) <eaaaanje@students.eaax.dk>; Bodil Pedersen (EAAABOPE) <eaaabope@students.eaax.dk>; Åse Andersen (EAAAIDAN) <eaaaasan@students.eaax.dk>; Mühl Svendsen (EAAAPESV) <eaaamusv@students.eaax.dk>";

// Get an array of the addresses by splitting on ;
const addresses = outlook.split(';').map(s => s.trim());
for (let address of addresses) {
  // Split each address on space
  const parts = address.split(' ');
  // the first two should be first and last name
  const name = `${parts[0]} ${parts[1]}`;
  // the fourth element should be the email address
  // remove the angle brackets
  const email = parts[3].replace(/(<|>)/g, '');
  // Do your table thing with the results
  console.log(name, email);
}
0 голосов
/ 01 марта 2019

Если у вас есть строка, я буду использовать что-то вроде: string.match (/\<(.*?)\>/ g) [0]

0 голосов
/ 01 марта 2019

Сначала используйте глобальный match().Это вернет только захваченные строки.Затем переберите этот массив совпадений и используйте exec() для каждого отдельного пользователя, чтобы отделить группы захвата имени и электронной почты.

const regex = /([^ ]+ [^ ]+) \(.*?\) <(.*?)>/g;

const outlook = "Anders Jensen (EAAAANJE) <eaaaanje@students.eaax.dk>; Bodil Pedersen (EAAABOPE) <eaaabope@students.eaax.dk>; Åse Andersen (EAAAIDAN) <eaaaasan@students.eaax.dk>; Mühl Svendsen (EAAAPESV) <eaaamusv@students.eaax.dk>";

const tbody = document.getElementById('users')
  .getElementsByTagName('tbody')[0];
const users = outlook.match(regex);

users.forEach((user, index) => {
  const userRegex = /([^ ]+ [^ ]+) \(.*?\) <(.*?)>/;
  const userInfo = userRegex.exec(user);
  const row = tbody.insertRow(index);
  
  if (userInfo) {
    const nameCell = row.insertCell(0);
    const emailCell = row.insertCell(1);
    nameCell.innerHTML = userInfo[1];
    emailCell.innerHTML = userInfo[2];
  }
  
});
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}

th, td {
padding: 10px;
}
<table id="users">
  <thead>
    <tr>
      <th>Name</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
  
  </tbody>
</table>
0 голосов
/ 01 марта 2019

Ну, regexName.exec(outlook).length равно 1, поэтому ваш цикл будет выполняться только один раз.Возможно, вам придется удалить соответствующую строку из outlook, если вы хотите сделать это таким образом.Однако я бы посоветовал сначала разделить строку outlook на ;, а затем использовать длину этого массива в качестве условия цикла.Я думаю, твое регулярное выражение в порядке

// this is some example of the names & email adresses - they are fake
const outlook = "Anders Jensen (EAAAANJE) <eaaaanje@students.eaax.dk>; Bodil Pedersen (EAAABOPE) <eaaabope@students.eaax.dk>; Åse Andersen (EAAAIDAN) <eaaaasan@students.eaax.dk>; Mühl Svendsen (EAAAPESV) <eaaamusv@students.eaax.dk>";

// we find all the emails & names of the students
let regexEmail = /\<.*?\>/g;
let regexName = /(\w+\s\w+\s)/gi;

// an array of all the td-tags
let tdTags = [];

let fragments = outlook.split(';');
// The emails and names are inserted in the table
for(let i = 0; i < fragments.length; i++) {
  console.log(fragments[i])
  let name = fragments[i].match(regexName)
  let email = fragments[i].match(regexEmail)

  tdTags.push({ name, email: email });// e-mail
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...