Reputation: 153
In this case I am trying to create a pattern that matches anything BUT a |
or }}
but I would like to understand how to do this in the general case as well.
That is I would like to match any character any number of times and stop once I hit either a |
or a }}
So
[\w\s`~!@#\$%\^&\*\(\)-\+=\[\]\\;"',<\.>\/\?\{\}:]*
and return when I hit }}
or |
What I currently have is:
var regex = /[\w\s`~!@#\$%\^&\*\(\)-\+\=\[\]\\;"',<\.>\/\?\{\}\:]*(?!((\|)|(\}\})))/
then something like
var str = "abc}}";
str.match(regex)
should return abc
but mine doesn't even work even after hours using debuggex
The problem I have is I need to also be allowed to have a single }
within my match so just taking out the \}
from the first group doesn't work.
I don't even understand how this is possible and in other expressions I will need to be able to recognize [anything but {{, {:, {{{, |, }}]
and I can't grasp the logic to code this.
Also in case I missed a special character that needs to be escaped or have a redundant backslash please let me know.
Upvotes: 1
Views: 39
Reputation: 150080
Maybe something like this:
/(.+?)(\||}}||$)/
That is:
(.+?)
non-greedy capturing match of one or more of any character(\||}}||$)
capturing match of \|
or }}
or $
(end of string).The result you want will be the first captured match, i.e., the second item of the array returned by .match()
(if there is a match):
var regex = /(.+?)(\||\}\}|$)/;
console.log("abc}}".match(regex));
console.log("abc}def}}".match(regex));
console.log("abc}123}456}}x".match(regex));
console.log("abc|def".match(regex));
console.log("abc".match(regex));
Upvotes: 1
Reputation: 2914
This should do it:
var regex = /(.*[^}}|\|])/
The ()
indicate a capturing group, which is how you get it to return abc
in your example.
Generally translated:
.*
any number of any characters...
[^
except for...
}}|\|]
}} or |.
(Tip - https://regex101.com/ is a pretty handy tool for generating and testing regular expressions.)
Upvotes: 0