Используйте регулярное выражение, чтобы найти конкретную строку не в HTML-тег - PullRequest
18 голосов
/ 06 июня 2009

У меня возникли трудности с определенным регулярным выражением, которое я пытаюсь использовать. Я ищу каждое вхождение строки (для моих целей я скажу, что это « mystring ») в документе, ЗА ИСКЛЮЧЕНИЕМ того, где она находится в теге, например,

<a href="_mystring_">

не должно совпадать, но

<a href="someotherstring">_mystring_</a>

Должно совпадать, поскольку оно не внутри тега (что означает «внутри маркеров <и>»), для этого я также использую функции регулярного выражения .NET.

Ответы [ 7 ]

19 голосов
/ 06 июня 2009

Это должно сделать это:

(?<!<[^>]*)_mystring_

Он использует отрицательный взгляд, чтобы убедиться, что у совпадающей строки нет <перед ним без соответствующего>

9 голосов
/ 27 апреля 2014

Если ваш процессор регулярных выражений не поддерживает просмотр переменной длины, попробуйте следующее:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

Сохранить группы захвата 1 и 3 и заменить группу захвата 2:

Например, в Eclipse найдите:

(<.+?>[^<>]*?)(_mystring_)([^<>]*?<.+?>)

и заменить на:

$1_newString_$3

(Другие процессоры регулярных выражений могут использовать другой синтаксис группы захвата, например \ 1)

7 голосов
/ 22 мая 2013

Еще одно регулярное выражение для поиска, которое работает для меня

(?![^<]*>)_mystring_

Источник: https://stackoverflow.com/a/857819/1106878

2 голосов
/ 04 августа 2011

Быстрая и грязная альтернатива - использовать функцию замены регулярного выражения с обратным вызовом для кодирования содержимого тегов (все между <и>), например, используя base64, затем выполнить поиск, а затем выполнить другой обратный вызов для декодирования содержимого вашего тега. .

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

0 голосов
/ 06 июня 2009

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

  • найдите все mystring s, которые сначала находятся в тегах - потому что я не могу написать выражение, чтобы сделать обратное:)
  • поменяй их на что-то другое
  • затем замените все остальные mystring (которые не включены в теги), как вам нужно
  • восстановить исходные mystring s, которые были в тегах

Итак, используя <[^>]*?(mystring)[^>]*>, вы можете найти помеченные. Замените их на otherstring . Вы обычно заменяете mystring s, которые остались. Заменить другую строку обратно на mystring

Грубый, но эффективный .... может быть.

0 голосов
/ 06 июня 2009

Поиск в регулярных выражениях, как правило, не очень хорошая идея в XML. Слишком легко столкнуться с проблемами с поисковыми выражениями, совпадающими с большим или слишком маленьким. Также почти невозможно сформулировать регулярное выражение, которое может правильно идентифицировать и обрабатывать разделы CDATA, инструкции обработки (PI) и escape-последовательности, которые допускает XML.

Если у вас нет полного контроля над получаемым XML-содержимым и вы не можете гарантировать, что он не будет включать такие конструкции (и не изменится), я бы посоветовал использовать какой-либо XML-анализатор (XDocument или XmlDocument). нетто, например).

Сказав, что, если вы все еще намерены использовать регулярное выражение в качестве механизма поиска, что-то вроде следующего должно работать с использованием класса RegEx в .NET. Вы можете протестировать его с некоторыми из ваших собственных тестовых случаев на сайте, таком как Regexlib . Вы также можете найти в каталоге их регулярных выражений что-то, что может соответствовать вашим потребностям.

[>]. (_ _ MyString). [<] </p>

0 голосов
/ 06 июня 2009

Зачем использовать регулярные выражения?

Для xhtml загрузите его в XDocument / XmlDocument; для (не-x) html пакет Html Agility представляется более разумным выбором ...

В любом случае, это будет анализировать HTML в DOM, чтобы вы могли перебирать узлы и проверять их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...