Не перехватывайте необязательный HTML-тег в регулярном выражении - PullRequest
0 голосов
/ 09 июня 2019

У меня есть такой HTML-текст.

<td class="team2"><a class="black" href="/team/test/">Tést team</a></td>
<td class="team3"><a class="black" href="/team/test/">opponent team</a></td>
<td class="team2">test team</td>
<td class="team3">my  team</td>

а это мое регулярное выражение.

<td class="team\d">(<a class="black" href=".+">)?(.+)(<\/a>)?<\/td>

Я хочу сгруппировать (прочитать) названия команд. Но, как вы можете видеть, последние две строки не имеют тега <a>. Мое регулярное выражение также выделяет в первых двух строках конец </a>. Как этого избежать?

enter image description here

1 Ответ

0 голосов
/ 09 июня 2019

Ваше оригинальное выражение великолепно, просто отсутствует (?), к которому мы добавим это и немного упростим его до:

<td(.+?)>(<a(.+?)>)?(.+?)(<\/a>)?<\/td>

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

const regex = /<td(.+?)>(<a(.+?)>)?(.+?)(<\/a>)?<\/td>/gm;
const str = `<td class="team2"><a class="black" href="/team/test/">Tést team</a></td>
<td class="team3"><a class="black" href="/team/test/">opponent team</a></td>
<td class="team2">test team</td>
<td class="team3">my  team</td>`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...