«Ни один из» против отрицательного взгляда - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь найти все href или src, не начинающиеся с косой черты или хэша.

Например,

<a href="img/foo.png"></a>      // should match
<a href='img/foo.png'></a>      // should match
<img src='img/foo.png'></a>     // should match
<a href="#"></a>                // should not match
<a href="/img/ajax.gif"></a>    // should not match
<img src='/img/ajax.gif'></a>    // should not match

Я пытался решить эту проблему с помощью Отрицательный взгляд вперед .

(href|src)=["']((?!\/)|(?!#)).*["']

enter image description here

Но это соответствует всему ...

enter image description here


Затем я попробовал это с помощью метода "Ни один из":

(href|src)=["\'][^\/#].*['"]

enter image description here

enter image description here

Это работает.Почему Отрицательный Lookahead терпит неудачу?

1 Ответ

2 голосов
/ 27 сентября 2019

Поскольку часть ((?!\/)|(?!#)) соответствует позиции, которая либо не сопровождается / или #, в то время как [^\/#] соответствует символу, равному ни / , ни #.

Вам необходимо записать прогноз в виде (?![\/#]): позиция, за которой не следует / , ни #.

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

(href|src)=(["'])(?![\/#]).*?\2

См. Демонстрационный пример регулярного выражения и график регулярных выражений :

enter image description here

Подробности

  • (href|src) - Группа 1: либо href, либо src
  • = - = символ
  • (["']) - группа 2: ' или "
  • (?![\/#]) - следующий символ может 't быть / или #
  • .*? - любые 0+ символов, кроме символов перевода строки, как можно меньше
  • \2 - обратная ссылка на группу 2, то же значение, что изахваченный в группу ' или ".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...