regex - Ruby Regular Expression - prevent overlapping matches -


say have tag <tag> , want match groups of <tag>...<tag> in string. can use regular expression along lines of <tag>.*<tag>. matches <tag>foo<tag>, good, matches <tag>foo<tag>bar<tag>, behavior don't want. want <tag>foo<tag> matched, bar excluded, , tag on end start of next match. how do this?

the simplest solution use lazy quantifier ? forces .* match few characters possible (and not many possible, unadorned .* try match):

<tag>.*?<tag> 

a safer, more explicit solution use negative lookahead assertion:

<tag>(?:(?!<tag>).)*<tag> 

while in current case, there no difference in behavior, second 1 extendable handle open/close tags, making sure nested tags aren't incorrectly matched:

<tag>(?:(?!</?tag>).)*</tag> 

when applied <tag>foo<tag>bar</tag>baz</tag> match <tag>bar</tag>, , not <tag>foo<tag>bar</tag> solution lazy quantifier would.


Comments

Popular posts from this blog

java.util.scanner - How to read and add only numbers to array from a text file -

rewrite - Trouble with Wordpress multiple custom querystrings -