Apologies if the title is too vague, I don’t know the terminology for this issue so any suggestions would be much appreciated!
Current pattern: ^(?:\/[^\/]*){2}(?:\/tree|)
Target language/platform: JS
Inputs and expected results:
1. /foo/bar pass
2. /foo/bar/tree/baz pass
3. /foo/bar/tree/baz/foobar pass
4. /foo/bar/blob fail
5. /foo/bar/blob/x.js fail
Testing mechanism: pattern.test(entryString);
These are GitHub paths, and what I’m trying to do is match a repository (/foo/bar), or any subpath (/foo/bar/tree/baz/....). The third path segment should be tree if it exists, else, the test should fail.
The problem with the pattern above is that the 4th & 5th items still pass despite matching neither condition of that pattern. It’s probably some silly mistake, but can’t figure out what it is.
>Solution :
You could optionally match /tree followed by optional repetitions or / and other chars than / and assert the end of the string $ to prevent partial matches.
^(?:\/[^\/]*){2}(?:\/tree(?:\/[^\/]*)*)?$
Explanation
^Start of string(?:\/[^\/]*){2}Repeat 2 times/and optionally any char except/(?:Non capture group\/treeMatch/tree(?:\/[^\/]*)*Optionally repeat/any char except/
)?Close the non capture group and make it optional$End of string
If you don’t need to match the whole string, you can assert the end of the string in the alternation:
^(?:\/[^\/\n]*){2}(?:\/tree\/|$)