Is there a way to use ungreedy matching in JavaScript for regular expressions?
Asked Answered
C

2

34

I wonder if there is a way to use ungreedy matching in JavaScript? I tried the U modifer, but it doesn't seem to work.

I want to write a small BBCode parser in JavaScript, but without ungreedy matching it isn't possible (at least as far as I see it) to do something like this:

'[b]one[/b] two [b]three[/b]'.replace( /\[b\](.*)\[\/b\]/, '<b>$1</b>' );

But such a replacement would be nice since there is no need to check for HTML validity then. Unclosed markups will stay simple text.

Cormier answered 12/12, 2008 at 20:22 Comment(0)
C
70

You can use ? after * or + to make it ungreedy, e.g. (.*?)

Corallite answered 12/12, 2008 at 20:24 Comment(3)
Incredible, but it just works! Thanks. in other enviroments, the flag /u (ungreedy) can be used. But for javascript methods is not available (with exception of nodejs methods, i think)Stab
Please could you try to explain the logic behind this trick ?Lack
@Lack there isn't a logic behind this trick to explain. * and *? are two different quantifiers. * is the greedy quantifier (match zero to unlimited times as many times as possible) *? is the lazy quantifier (match zero to unlimited times as few times as possible). Fun fact: Using the flag U (Ungreedy) seems to revers the meaning. However the flag isn't supported by js and the lowercase u is the unicode-flag.Grisette
W
4

I'm late, but I'll post the regex anyway.

'[b]one[/b] two [b]three[/b]'.replace( /\[b\](.+?)\[\/b\]/g, '<b>$1</b>' );
Welcome answered 12/12, 2008 at 20:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.