I have this expression which is almost what I need:
/(?=^.{5,12}$)(^[a-zA-Z\u0590-\u05fe]{0,4}[0-9]{3,8}[a-zA-Z\u0590-\u05fe]{0,4}$)/
except, I need to only allow 4 letters total (4 in the beginning and 0 in the end,3 and 1, 2 and 2, 0 and 4, etc...)
allowed inputs: 11abcd11 1abcdefg123 abcd1234
unallowed inputs: 1abcd11 abcd123 1abcd12
is there a way to achieve this? thanks!
CodePudding user response:
To make sure there are exactly four letters in the string, you can use
^(?=.{5,12}$)(?=(?:[^a-zA-Z\u0590-\u05fe]*[a-zA-Z\u0590-\u05fe]){4}[^a-zA-Z\u0590-\u05fe]*$)[a-zA-Z\u0590-\u05fe]{0,4}[0-9]{3,8}[a-zA-Z\u0590-\u05fe]{0,4}$
See the regex demo
The (?=(?:[^a-zA-Z\u0590-\u05fe]*[a-zA-Z\u0590-\u05fe]){4}[^a-zA-Z\u0590-\u05fe]*$)
positive lookahead makes sure there are four sequences of any zero or more "non-letters" followed with a "letter" and then there are zero or more "non-letters" till the end of string.
If you can target ECMAScript 2018 compliant engines you can use a Unicode-aware version:
/^(?=.{5,12}$)(?=(?:\P{L}*\p{L}){4}\P{L}*$)\p{L}{0,4}[0-9]{3,8}\p{L}{0,4}$/u
See this regex demo, where \p{L}
matches letters. You may also replace it with \p{Alphabetic}
which also matches letters that are Roman numbers.