sawa sawa - 1 year ago 71
Ruby Question

Ensure non-matching of a pattern within a scope

I am trying to create a regex that matches a pattern in some part of a string, but not in another part of the string.

I am trying to match a substring that

(i) is surrounded by a balanced pair of one or more consecutive backticks


(ii) and does not include as many consecutive backticks as in the surrounding patterns

(iii) where the surrounding patterns (sequence of backticks) are not adjacent to other backticks.

This is some variant of the syntax of inline code notation in Markdown syntax.

Examples of matches are as follows:

"xxx`foo`yyy" # => matches "foo"
"xxx``foo`bar`baz``yyy" # => matches "foo`bar`baz"
"xxx```foo``bar``baz```yyy" # => matches "foo``bar``baz"

One regex to achieve this is:


which uses a non-greedy match.

I was wondering if I can get rid of the non-greedy match.

The idea comes from when the prohibited pattern is a single character. When I want to match a substring that is surrounded by a single quote
that does not include a single quote in it, I can do either:


The first one uses non-greedy match, and the second one uses an explicit non-matching pattern

I am wondering if it is possible to have something like the second form when the prohibited pattern is not a single character.

Going back to the original issue, there is negative lookahead syntax
, but I cannot restrict its effective scope. If I make my regex like this:


then the effect of
will not be limited to within
, but will extend to the whole string. And since that contradicts with the
at the end, the regex fails to match.

Is there a regex technique to ensure non-matching of a pattern (not-necessarily a single character) within a certain scope?

Answer Source

There must be at least one non-backtick inside the delimiters, so you can search for any number of character-not-followed-by-a-delimiter followed by a single non-backtick: