I'm trying to get a pattern match for slugs, these would be alphanumeric sequences hyphen separated.
They can be:
- Number starting or ended, but not only digits
- Can also be only alphabetic
- Can also can be only one word
I got /[a-z0-9] (?:-[a-z0-9] )*$/
which almost works but it'll match. 3
or 10
For example:
- 2020-best-year-of-world should match
- best-of-world should match
- best-of-2021 should match
- 2021 should not match
I leave here a regex101 link with my test
CodePudding user response:
Apart from adding an anchor ^
to assert the start of the steing, you can add a negative lookahead to not only match digits, or else your pattern will also match only 2020.
^(?![\d] $)[a-z0-9] (?:-[a-z0-9] )*$
In parts, the pattern matches:
^
Start of string(?![\d] $)
Negative lookahead, assert not only hyphens and digits to the right[a-z0-9]
Match 1 occurrences of a-z or 0-9(?:-[a-z0-9] )*
Optionally repeat the previous pattern preceded by-
$
End of string
CodePudding user response:
How about this:
/[a-z0-9] (-*[a-z]) (?:-[a-z0-9] )*$
- It starts with a char or a number
- It needs to contain char or
-
in the middle (the part I've added from your regex, in order to filter only digit) - Ends with char, digit
I wasn't sure if, for instance 2020-2021 should match. If it shouldn't, you should do an small edit on the middle part...
I've tested in the same tool you suggested