I'm trying to write a regex that will find all values between curly braces that do not begin with "my:". For example, I want to capture {this}
but not {my:monkey}
.
The pattern that captures everything is:
\{([^\}]*)\}
I'm having trouble getting it to work. My closest shot so far is:
\{[^my:]*([^\}]*)\}
This fails because it only ignores tags beginning with "m", "y" or ":".
I'm sure there is a command I'm overlooking to treat "my:" as a block..
(Note: Must work for Javascript)
I'm trying to write a regex that will find all values between curly braces that do not begin with "my:". For example, I want to capture {this}
but not {my:monkey}
.
The pattern that captures everything is:
\{([^\}]*)\}
I'm having trouble getting it to work. My closest shot so far is:
\{[^my:]*([^\}]*)\}
This fails because it only ignores tags beginning with "m", "y" or ":".
I'm sure there is a command I'm overlooking to treat "my:" as a block..
(Note: Must work for Javascript)
Share Improve this question edited Jul 19, 2013 at 22:58 Luke Willis 8,5804 gold badges48 silver badges80 bronze badges asked Jul 19, 2013 at 22:24 AnthonyAnthony 5,43312 gold badges53 silver badges86 bronze badges 1- What are you trying to do with it? Just test the string or do some kind of replacement? – p.s.w.g Commented Jul 19, 2013 at 22:29
4 Answers
Reset to default 14This one should do:
/\{((?!my:)[^}]+)\}/g
Check quick demo http://jsbin.com/ujazul/2/edit
Summarize as following:
// test match thing_done but not some_thing_done (using nagative lookbehind)
console.log(/(?<!some_)thing_done/.test("thing_done")); // true
console.log(/(?<!some_)thing_done/.test("some_thing_done")); // false
// test match thing_done but not think_done_now (using nagative lookahead)
console.log(/thing_done(?!_now)/.test("thing_done")); // true
console.log(/thing_done(?!_now)/.test("thing_done_now")); // false
// test match some_thing_done but not some_thing (using positive lookbehind)
console.log(/(?<=some_)thing_done/.test("thing_done")); // false
console.log(/(?<=some_)thing_done/.test("some_thing_done")); // true
// test match thing_done but not think_done_now (using positive lookahead)
console.log(/thing_done(?=_now)/.test("thing_done")); // false
console.log(/thing_done(?=_now)/.test("thing_done_now")); // true
Dialogue version:
I need match some_thing_done not thing_done:
Put `some_` in brace: (some_)thing_done
Then put ask mark at start: (?some_)thing_done
Then need to match before so add (<): (?<some_)thing_done
Then need to equal so add (<): (?<=some_)thing_done
--> (?<=some_)thing_done
?<=some_: conditional back equal `some_` string
Link example code: https://jsbin.com/yohedoqaxu/edit?js,console
You can do something like this:
var input = "I want to capture {this} but not {my:monkey}";
var output = input.replace(/{(my:)?([^}]*)}/g, function($0, $1, $2) {
return $1 ? $0 : "[MATCH]";
});
// I want to capture [MATCH] but not {my:monkey}
{(?!my:)(.*?)}
works in regex pal: http://preview.tinyurl.com/nkcpoy7