I'd like to match certain file types (e.g., ".txt") with a non-empty root name that doesn't end in a particular substring (e.g., "-bad"). With negative lookbehind support, the solution is simple:
/.(?<!-bad)\.txt$/
Safari, however, still does not support negative lookbehinds. Ugh. How could I achieve the same result using a negative lookahead? I'd like to do this with a single regular expression. Please do not provide any non-regex or multi-step solutions.
The test code below shows that I'm close, but one test is still failing. ๐
const regex = /.((?!-bad).{4})\.txt$/;
const tests = [
['this-file-bad.txt', false],
['this-file.txt', true],
['.txt', false],
['f.txt', true]
];
const results = tests.map(([input, expected]) => ((regex.test(input) === expected) ? 'โ
' : 'โ') + input);
console.log(results.join('\n'));
You can use
^(?!.*\-bad\.txt$).+\.txt$
The regular expression reads as follows:
^)(?!...)) to assert that the string does not end "-bad.txt"To check for any of several file suffices at the same time (which, based on your comment below, may be helpful) you could write, for example:
^(?=.*\.(txt|pdf|csv|docx|html|jpeg)$)(?!.*\-bad\.\1$).+\.\1$
The positive lookahead at the beginning has the sole purpose of capturing the file suffix at the end of the string so that a back-reference can be used in the negative lookahead and at the end.