Регулярное выражение для условной замены угловых скобок

Можно ли создать одно регулярное выражение для замены ‹ и > их эквивалентами сущностей в Komodo Edit?

s/<|>/&lt;|&gt;/

person Community    schedule 29.09.2009    source источник


Ответы (6)


Я предполагаю, что вам, возможно, придется преобразовать & в &amp; и так далее.

В этом случае, скорее всего, есть библиотека или функция на любом языке/платформе, которую вы используете (например, в Java проверьте StringEscapeUtils). Укажите, какой язык вы используете, и кто-нибудь здесь, без сомнения, укажет вам на что-то подходящее.

person Brian Agnew    schedule 29.09.2009

Это легко сделать практически на любом языке без использования регулярных выражений:

PHP:

$xml = str_replace(array('>', '<'), array('&gt;','&lt;'), $xml);

Питон:

xml = xml.replace('>', '&gt;').replace('<','&lt;');

и т.п.

person too much php    schedule 29.09.2009

Вы можете использовать хеш-переменную, например:

my %data;
$data{"<"} = '&lt;';
$data{">"} = '&gt;';
s/(<|>)/$data{$1}/g;
person Johan Soderberg    schedule 29.09.2009

Это зависит от языка, который вы используете. В Perl вы можете сделать:

s/([<>])/$1 eq '<' ? '&lt;' : '&gt;'/ge

Другие языки обычно позволяют вам предоставить функцию обратного вызова match, которая возвращает строку замены. А именно: в С# вы можете сделать это:

Regex.Replace("<", "([<>])", x => x.Value == "<" ? "&lt;" : "&gt;")
person brianary    schedule 29.09.2009

Спасибо всем. Я искал что-то, что я мог бы использовать в Komodo Edit, поэтому переменные и условные операторы не были вариант. Вот лучшее решение, которое я нашел, основанное на руководстве по Sed по адресу IBM Developerworks:

s/<([^>]*)>([^<]*)<([^>]*)>/&lt;\1&gt;\2&lt;\3&gt;/
person Community    schedule 13.10.2009

В Komodo Edit 5.x используйте moreKomodo для сохранения следующего поиска/замены поиск по регулярному выражению:

Находить:

<([^>]*)>([^<]*)<([^>]*)>

Заменять:

&lt;\1&gt;\2&lt;\3&gt;
person Paul Sweatte    schedule 12.07.2013