Regular Expression to match {asdf} but not {{asdf}}
regex, vbscript
Solution
If your regex engine supports lookarounds, they are the way to go:
(?<!\{)\{\w+\}(?!\})
This does literally what you want. The lookbehind asserts that there is no `{` preceding your `{`, and the lookahead asserts that there is no `}` following your `}`.
Note that `{1}` does never do anything. Ever.
Also note that you don't need to make `\w+` ungreedy, because it cannot consume `}` anyway.
Finally, I just want to put it here, that an alternative to escaping `{` and `}` is to put it into a one-character character class. It's a matter of taste which one you prefer but I like the readability of this one better:
(?<![{])[{]\w+[}](?![}])
EDIT:
It seems like VBScript does not support lookbehinds.
That is a bit of an issue. The closest thing you can get is:
(^|[^{])[{]\w+[}](?![}])
However, if the match is not found at the beginning of the string, this will include the preceding character in the match. This alone is not a problem, because you could get rid of that character through capturing of substring functions or something. However, matches cannot overlap, so if you have an input like `{some}{string}` you won't easily get both matches (because the first `}` has to be part of the second match). Some engines provide `\G` as the equivalent of `^` for continuing matches, but VBScript does not seem to support that either. Hence, it's going to get ugly from here on.
What you could do is to exclude the closing `}` from the match (using another lookahead):
(^|[^{])[{]\w+(?=[}](?![}]))
Now you will get matches `{some` and `}{string`, so will have to append every match with `}` and remove the first character from every match that is not at the beginning of your string. Or if you can get hold of the captured results, you can use
(^|[^{])([{]\w+)(?=[}](?![}]))
Then retrieve capturing group `2` and append `}`.
Problem
I have a very straightforward problem. I am using this regular expression to match instances of `{somestring}`. ``` \{{1}(\w+?)\}{1} ``` The problem is that I need it to ignore instances of `{{somestring}}`, but of course, it is matching the inner `{somestring}` in `{{somestring}}`. Any idea how I can tweak the expression to skip anything like `{{somestring}}`? I am using vbscript's regular expression engine.