I have an issue with Regex. How I can check a string with numbers, special symbols like range symbol -
and comma? I need to check string with that rules:
- Only numbers,
,
and-
. No letters, other symbols, etc. - Only one
,
between 2 numbers - Only one
-
, between 2 numbers - Don't allow
-
and,
at the start and end of the string - Don't allow
,
after-
or-
after,
"10,11-12,34" // correct
"1,2-3,4-5,6-11,12,13-14,16" // correct
",10,11-12,34" // incorrect
"-10,11-12,34" // incorrect
"10,,11-12,34" // incorrect
"10,11--12,34" // incorrect
"10,-11-12,34" // incorrect
"10,11-12,-,34" // incorrect
"10,11-12,34," // incorrect
"10,11-12,34-" // incorrect
I'll be glad for any help. Thanks
CodePudding user response:
/^\d (?:-\d )?(?:,\d (?:-\d )?) $/
should do it. Breakdown:
^
- start of input\d
- one or more digits(?:-\d )
- non-capturing group allowing a-
followed by one or more digits?
- makes the group above optional(?:,\d (?:-\d )?)
- non-capturing group allowing a,
followed by the same as above, to allow multiple numbers or ranges with commas separating them$
- end of input
const tests = [
{ string: "10,11-12,34", good: true },
{ string: ",10,11-12,34", good: false },
{ string: "-10,11-12,34", good: false },
{ string: "10,,11-12,34", good: false },
{ string: "10,11--12,34", good: false },
{ string: "10,-11-12,34", good: false },
{ string: "10,11-12,-,34", good: false },
{ string: "10,11-12,34,", good: false },
{ string: "10,11-12,34-", good: false },
{ string: "1,2-3,4-5,6-11,12,13-14,16", good: true },
];
const rex = /^\d (?:-\d )?(?:,\d (?:-\d )?) $/;
for (const { string, good } of tests) {
const result = rex.test(string);
const message = result === good ? "OK" : "<== ERROR";
console.log(`${JSON.stringify(string)} => ${result} ${message}`);
}
.as-console-wrapper {
max-height: 100% !important;
}
If a single number like 15
or a single range like 15-20
is valid, change the
near the end to *
for "zero or more times" on the non-capturing group that allows the comma followed by more: /^\d (?:-\d )?(?:,\d (?:-\d )?)*$/
const tests = [
{ string: "10,11-12,34", good: true },
{ string: ",10,11-12,34", good: false },
{ string: "-10,11-12,34", good: false },
{ string: "10,,11-12,34", good: false },
{ string: "10,11--12,34", good: false },
{ string: "10,-11-12,34", good: false },
{ string: "10,11-12,-,34", good: false },
{ string: "10,11-12,34,", good: false },
{ string: "10,11-12,34-", good: false },
{ string: "1,2-3,4-5,6-11,12,13-14,16", good: true },
{ string: "15", good: true },
{ string: "15-20", good: true },
];
const rex = /^\d (?:-\d )?(?:,\d (?:-\d )?)*$/;
for (const { string, good } of tests) {
const result = rex.test(string);
const message = result === good ? "OK" : "<== ERROR";
console.log(`${JSON.stringify(string)} => ${result} ${message}`);
}
.as-console-wrapper {
max-height: 100% !important;
}