I am dealing with an issue with Regex. I have a input which has maxLength 10.
I achieved till now to have the first given value can be digits for example 12345 but then it waits for a dash and after it you can write a letter or again a number maxLength=10 for example: 12345-a121 is allowed and it works with the currrent
But I want to be possible after the 5 digits to be allowed letters or dash because for the moment with this regex it is allowed only dash after 5 digits. For example 12345a or 12345- to be allowed. This is the actual regex what I am using.
Valid/Matches: 12345a235, 123a, 12345-aa1, 12345a, 12345-a.
Not Valid/Does not matches: -11, 111111, aaaa,
(?=^[^W_]{1,5}-[^W_]{1,8}$)^.{1,10}$|^[^W_]{1,5}$
I am debugging on the regex101.com but I am not finding a way for that to allow. 12345a for example
This is the condition to check if it matches or not.
if (!this.value.toString().match('^\d{1,5}(?!\d )[-\p{L}\d] $') && this.value.toString()) {
return ValidationInfo.errorCode("You need to do something");
Thank you for the help
CodePudding user response:
Edit since the patterns of the first approach can be simplified and also were missing the limitations of the ending sequence's length.
for matching only with
Letter
unicode property escapesmatching and capturing with
Letter
unicode property escapes
Example code ...
const multilineSample = `12345a235
123a
12345-aa1
12345a
12345-a
12-a235dkfsf
12-a235dkfsfs
123a-dssava-y
123a-dssava-1a
12345-aa1--asd-
12345-aa1--asd-s
-11
111111
aaaa`;
// see ... [https://regex101.com/r/zPkcwv/3]
const regXJustMatch = /^\d{1,5}[-\p{L}][-\p{L}\d]{0,9}$/gmu;
// see ... [https://regex101.com/r/zPkcwv/4]
const regXNamedGroups =
/^(?<digitsOnly>\p{N}{1,5})(?<miscellaneous>[-\p{L}][-\p{L}\p{N}]{0,9})$/gmu;
console.log(
'matches only ...',
multilineSample.match(regXJustMatch)
);
console.log(
'matches and captures ...', [
...multilineSample.matchAll(regXNamedGroups)
]
.map(({ 0: match, groups }) => ({ match, ...groups }))
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
1st approach
straightforward and plain ...
/^\d{1,5}(?!\d )[-\p{L}\d] $/u
with named capture groups ...
/^(?<digitsOnly>\p{N}{1,5}(?!\p{N} ))(?<miscellaneous>[-\p{L}\p{N}] )$/u
For both variants it is obvious to start with ...
- a digit sequence of at least 1 and up to 5 digits ...
- traditional ...
^\d{1,5}
- unicode property escapes ...
^\p{N}{1,5}
- traditional ...
It's also clear, one wants to end with a character sequence of any of dash and/or word. Due to having to exclude _
one can not just use the \w
escape for letters and digits since \w
covers/includes _
as well. But one could use unicode property escapes, thus ...
- a regex covering the end of a line with a valid character class is ...
- already mixed ...
[-\p{L}\d] $
- mostly unicode escapes ...
[-\p{L}\p{N}] )$
- already mixed ...
A combined regex like ... /^\d{1,5}[-\p{L}\d] $/u
... almost covers the requirements but fails for 111111
which of cause gets matched even though it shouldn't according to the requirements.
A negative lookahead ... (?!\d )
respectively (?!\p{N} )
... which follows the starting digit sequence does prevent any other (terminating) digit-only sequence, thus 123456
does not get matched anymore.
Example code ...
const multilineSample = `12345a235
123a
12345-aa1
12345a
12345-a
-11
111111
aaaa`;
// see ... [https://regex101.com/r/zPkcwv/1]
const regXJustMatch = /^\d{1,5}(?!\d )[-\p{L}\d] $/gmu;
// see ... [https://regex101.com/r/zPkcwv/2]
const regXNamedGroups =
/^(?<digitsOnly>\p{N}{1,5}(?!\p{N} ))(?<miscellaneous>[-\p{L}\p{N}] )$/gmu;
console.log(
'matches only ...',
multilineSample.match(regXJustMatch)
);
console.log(
'matches and captures ...', [
...multilineSample.matchAll(regXNamedGroups)
]
.map(({ 0: match, groups }) => ({ match, ...groups }))
);
.as-console-wrapper { min-height: 100%!important; top: 0; }