Reputation: 259
I am trying to figure out Regex that will only accept below strings.
7 and 8 numbers: '1234567' and '12345678'
7 and 8 numbers that start with T: 'T234567' and 'T2345678'
7 and 8 numbers that start with D: 'D234567' and 'D2345678'
7 and 8 numbers that start with TD: 'TD34567' and 'TD345678'
Regex I have is:
/^(T|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/
but it's not passing my unit test for 'D234567' and 'D2345678'
Upvotes: 2
Views: 52
Reputation: 86
const r = /^(?=.{7,8}$)T?D?\d+$/
is the simplest solution. Here's a breakdown of what happens:
import {lookAhead, maybe, sequence, suffix} from "compose-regexp"
const r = sequence(
// start anchor
/^/,
// are there exactly 7 or 8 characters before the end?
lookAhead(suffix([7,8], /./), /$/),
// optionally match a 'T'
maybe('T'),
// optionally match a 'D'
maybe('D'),
// match numbers until the end
suffix('+', /\d/),
/$/
)
You can try it out here
With tests aplenty.
Upvotes: 0
Reputation: 163362
You could write the pattern as:
^(?:\d{7,8}|[TD]\d{6,7}|TD\d{5,6})$
Explanation
^
Start of string(?:
Non capture group for the alternatives
\d{7,8}
Match 7-8 digits|
Or[TD]\d{6,7}
Match either T
or D
and 6-7 digits|
OrTD\d{5,6}
Match TD
and 5-6 digits)
Close the non capture group$
End of stringUpvotes: 4
Reputation: 259
I actually figure it out right after posted this question. Simply added |D after T| so like this.
/^(T|D|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/
Upvotes: 0