сопоставьте все, кроме шаблона регулярных выражений

#regex #ruby

#регулярное выражение #ruby

Вопрос:

У меня есть содержимое xml, как показано ниже

 <html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
</body>
</html>
 

В приведенном выше я хочу отобразить все, кроме 502 Bad Gateway в заголовке.

Я использовал приведенное ниже регулярное выражение для сопоставления 502 с плохим шлюзом

 (?<=title>)(.*?)(?=</title>)
 

Может кто-нибудь сказать мне, как это отрицать?

Я попробовал приведенные ниже предложения

 (?!((?<=title>)(.*?)(?=</title>)))
[^((?<=title>)(.*?)(?=</title>))]
 

Но они не сработали.

Я использую ruby regex

Комментарии:

1. Какой язык / движок регулярных выражений вы используете? Рекомендуется включить эту информацию, поскольку функции различаются у разных движков регулярных выражений.

2. Что именно вы хотите сделать? Вы хотите удалить заголовок из строки? Затем просто используйте re.sub (или аналогичные методы на других языках)

3. Я использую ruby regex

Ответ №1:

Вы хотите получить все, что не соответствует регулярному выражению?

Сохраните свой результат на языке, который вы предпочитаете.

Используйте некоторые инструменты, например:

  • WinMerge
  • Вне сравнения
  • KDiff3
  • DiffMerge
  • Слияние

Некоторые из них могут генерировать исправление. Используйте File -> Open … чтобы открыть две версии для сравнения. Это даст вам хорошее представление о том, что вы изменили. https://docs.moodle.org/dev/How_to_create_a_patch#Creating_a_patch_using_WinMerge

Ответ №2:

Вы могли бы просто использовать sub для удаления «502 Bad Gateway» в title :

 xml = "<head><title>502 Bad Gateway</title></head>"
xml.sub("<title>502 Bad Gateway</title>", "<title></title>")
# => "<head><title></title></head>"
 

Ответ №3:

Не очень знаком с ruby, но я предполагаю, что функции регулярных выражений схожи с PCRE, который поддерживает управляющие глаголы и рекурсию.

Вот регулярное выражение, которое соответствует вашему описанию:

 ((?<=title>)502 Bad Gateway(?=</title>))(*SKIP)(*F)|(?:(?!(?1))[sS]) 
 

Смотрите Доказательство

Комментарии:

1. Привет, Хао Ву, это работает только для PHP<7.3. Но я работаю в ruby regex engine, в котором это не работает.