views:

42

answers:

2

I need to add markup to some text using JavaScript regular expressions. In Python I could do this with:

>>> import re
>>> re.sub('(banana|apple)', r'<b>\1</b>', 'I have 1 banana and 2 apples!')
'I have 1 <b>banana</b> and 2 <b>apple</b>s!'

What is the equivalent in JavaScript? string.replace(regex, newstring) seems to only take a raw string for replacing.

+2  A: 

In the new string, you can reference capture groups via the tokens $1, $2, etc. A lot of the high-level reference sites (like w3schools) fail to document that. It's in the spec, of course, or more accessibly discussed on MDC.

So taking your example:

"I have 1 banana and 2 apples!".replace(/(banana|apple)/gi, "<b>$1</b>");

(Of course, the "s" in "apples" won't be inside the tag...) I used the 'i' flag there assuming you want to process "Banana" and "Apple" as well as "banana" and "apple".

T.J. Crowder
thanks - I was working from the w3schools documentation
Plumo
@Richard: Glad to help. Amusingly, I was surprised when I ran across this feature of #replace...because I, too, had been working from the w3schools pages. :-) Those pages are useful, but really *really* incomplete, so I work from the spec and MDC a lot more now.
T.J. Crowder
wow the Mozilla JavaScript documentation is so detailed! - I will have to get into the habit of checking there first.
Plumo
+2  A: 

You can use String.replace() for this and use $n to reference captured groups from the regular expression:

var in = 'I have 1 banana and 2 apples!';
var out = in.replace(/(banana|apple)/g, "<b>$1</b>");
cletus