Использовать регулярное выражение для поиска определенной строки не в теге html

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

<a href="_mystring_">

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

$1_newString_$3

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

Ответ 3

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

(?![^<]*>)_mystring_

Источник: fooobar.com/questions/316033/...

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

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