'How would I match `.scss`, `.sass`, `.css` but not `.ass`? (RegExp)
I have the following regex: /\.([s]?[ac]ss)$/. The problem is, it matches .scss, .sass, .css, .ass. How would I make it not match .ass?
Solution 1:[1]
How about just
/\.(s?css|sass)$/
Regex doesn't need to be very complex to work. This is a lot easier to read for other programmers (i.e. you in about 3 months) and does the same.
Sure you can smush it more together, but why would you? Regex are complicated enough, keep 'm simple if you can :)
Solution 2:[2]
Another way using alternation:
\.((?:s[ac]|c)ss)$
Here this non-capturing group (?:s[ac]|c) will match sa or sc or just c.
Solution 3:[3]
You can use
\.(?!a)(s?[ac]ss)$
See the regex demo. Details:
\.- a dot(?!a)- the next char cannot bea(s?[ac]ss)- Group 1: an optionals,aorcand thenss$- end of string.
Another regex that can work is
\.(s(?:css|ass)|css)$
See this regex demo. Details:
\.- a dot(s(?:css|ass)|css)-sand thencssorassorcss$- end of string.
NOTE: if you have a dynamic, user-defined list of such fixed strings to match after a . at the end of string, you can build these regexes automatically using the code at the bottom of my answer.
Solution 4:[4]
You could just list the ones you want to match:
let rx = /\.css|\.sass|\.scss/; // alphabetized for future maintenance
This isn't fancy, but it is very clear and easy to add more later.
I tested it here :

Solution 5:[5]
In your pattern \.([s]?[ac]ss)$ you match .ass because the leading s optional and the character class [ac] can match both characters.
Instead you could use lookarounds assertions, or use an alternation | to allow only certain alternatives.
Some other variations could be:
\.(s?c|sa)ss$
\.Match a.(Capture group 1s?c|saMatch an optionalsthen matchcor matchsa
)Close group 1ss$Matchssat the end of the string
\.(s[ac]|c)ss$
A variation on the previous pattern, now matching sa or sc or c
If in your environment the lookbehind assertion is supported:
\.s?[ac]ss$(?<!\.ass)
\.s?Match a.and optionals[ac]Match eitheraorcss$Matchssat the end of the string(?<!\.ass)Negative lookbehind, assert not.assto the left
Note that if you want a match only, you can also use a non capture group (?:...) instead.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | anubhava |
| Solution 3 | |
| Solution 4 | |
| Solution 5 | The fourth bird |
