RegExp: как исключить совпадающие группы из $ N? - PullRequest
3 голосов
/ 01 апреля 2012

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

el = '<div style="color:red">123</div>';
el.replace(/(<div.*>)(\d+)(<\/div>)/g, '$1<b>$2</b>$3');
// expecting result: <div style="color:red"><b>123</b></div>

После поиска в Google я обнаружил, что (?: ... ) в регулярных выражениях - означает игнорирование совпадения группы, таким образом:

el.replace(/(?:<div.*>)(\d+)(?:<\/div>)/g, '<b>$1</b>');
// returns <b>123</b>

но мне нужен ожидаемый результат из 1-го примера.

Есть ли способ исключить их? просто написать replace(/.../, '<b>$1</b>')?

Это всего лишь небольшой пример для понимания того, как исключить группы в регулярном выражении. И я знаю , что мы не можем проанализировать HTML с помощью регулярного выражения :)

Ответы [ 2 ]

3 голосов
/ 01 апреля 2012

То есть вы хотите получить тот же результат, используя только замену <b>$1</b>?

В вашем случае достаточно просто replace(/\d+/, '<b>$&</b>').

Но если вы хотите убедиться, чтотеги div вокруг числа, вы можете использовать lookarounds и \K, как в следующем выражении.За исключением того, что JS не поддерживает поддержку просмотра назад или \K, так что вам не повезло, вы должны использовать группу захвата для этого в JS.

<div[^>]*>\K\d+(?=</div>)
0 голосов
/ 01 апреля 2012

Там нет ничего плохого с заменой значение '$1<b>$2</b>$3'.Я бы просто изменил ваше регулярное выражение на следующее:

el = '<div style="color:red">123</div>';
el.replace(/(<div[^>]*>)(\d+)(<\/div>)/g, '$1<b>$2</b>$3');

Изменение соответствия первого первого div сохраняет полное соответствие тегам div, но гарантирует, что оно соответствует минимально возможному перед закрытием >первый тег div, а не максимально возможный.

С вашим регулярным выражением вы не получите то, что хотели с этой строкой ввода:

el = '<div style="color:red">123</div><div style="color:red">456</div>';

Проблема с использованием чего-то вроде:

el.replace(/\d+/, '<b>$&</b>')

- это то, что не работает должным образом с такими вещами:

el = '<div style="margin-left: 10px">123</div>'

, потому что он собирает числа внутри тега div.

...