views:

488

answers:

5

Is it possible to create a single regexp to replace < and > with their entity equivalents?

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

It depends on the language you are using. In Perl, you could do:

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

Other languages usually allow you to provide a match callback function that returns a replacement string. To wit: In C#, you can do this:

Regex.Replace("<", "([<>])", x => x.Value == "<" ? "&lt;" : "&gt;")
brianary
+2  A: 

I'm guessing that you may have to convert & to &amp; and so on.

If this is the case there's most likely a library or function in whichever language/platform you're using (e.g. in Java check out StringEscapeUtils). Indicate which language you're using and someone here will no doubt point you to something appropriate.

Brian Agnew
A: 

You could use a hash-variable, something like:

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

It is easy in to do this in just about any language without using regex:

PHP:

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

Python:

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

etc.

too much php
A: 

Thanks everyone. I was looking for something I could use in Komodo IDE, so variables and conditional statements were not an option. Here is the best solution I found, which was based on a Sed tutorial at Developerworks:

s/<([^>]*)>([^<]*)<([^>]*)>/&lt;\1&gt;\2&lt;\3&gt;/
Paul Sweatte