2010-03-25 5 views
3

Я относительный новичок в регулярных выражениях (хотя я использовал их много раз успешно). Я хочу, чтобы найти все ссылки в документе, которые не заканчиваются на «.html» регулярное выражение, которое я придумал это:RegExp: хочу найти все ссылки, которые не заканчиваются на «.html»

href=\"([^"]*)(?<!html)\" 

В Notepad ++, мой редактор, href=\"([^"]*)\" находит все ссылки (как те, это конец в «html», а те, которые этого не делают). Почему не работает отрицательный lookbehind?

Я также попытался опережение:

href=\"[^"]*(?!html\") 

, но это не сработало.

Может ли кто-нибудь помочь?

Приветствия, пресмыкаться

+9

Я думаю, что «Блокнот ++» просто не поддерживает взгляды на внешний вид. – Gumbo

+1

Это так уродливо, чтобы попытаться заставить регулярное выражение работать с Notepad ++. Я сдаюсь, есть так много раздражающих ограничений. – pars

ответ

8

Это регулярное выражение будет работать нормально, если бы вы использовали PERL или PCRE (например preg_match в PHP). Однако утверждения lookahead и lookbehind не поддерживаются большинством, особенно более простыми, механизмами регулярных выражений, такими как те, которые используются Notepad ++. Только большинство основных синтаксисов, таких как кванторы, подшаблоны и классы символов, поддерживаются почти всеми механизмами регулярных выражений.

Вы можете найти документацию для Notepad ++ регулярных выражений по адресу: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Regular_Expressions

+0

Документация является сбивающей с толку, потому что в ней есть раздел об обратном просмотре, который, по-видимому, указывает, что они поддерживаются. – mellamokb

1

Edit: Notepad ++ с помощью SciTE регулярных выражений и он не поддерживает осмотреться выражений.

Для получения дополнительной информации смотрите здесь http://www.scintilla.org/SciTERegEx.html


Оригинал ответа

^.*(?<!\.html)$

1

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

href=\"((([^"]*)([^h"][^"][^"][^"]|[^t"][^"][^"]|[^m"][^"]|[^l]))|([^"]|)([^"]|)([^"]|))\" 
0

Спасибо всем много.

В конце концов, регулярное выражение действительно не срабатывало.

Я просто использовал обходное решение и заменил все ссылки на себя + «.html», а затем заменил все вхождения «.html.html» на «.html».

Так я заменил href=\"([^"]*)\" с href="\1.html" и затем .html.html с .html

Спасибо в любом случае, пресмыкаться

0

Обратите внимание, что Notepad ++ (теперь?) Поддерживает assertions как это. (У меня есть Notepad ++ 6.3 от 3 февраля 2012 года.)

Я считаю, что Regular Expressions documentation подразумевает, что оба заменяющие-варианты используют тот же PCRE говор:

  • стандарт: Search | Replace (по умолчанию ярлык Ctrl H)
  • плагин: TextFX | TextFX Quick | Find/Replace (по умолчанию ярлык Ctrl R)

 Смежные вопросы

  • Нет связанных вопросов^_^