I want to validate some numbers with Regular expressions in flutter.
The Regular expression looks like this: RegExp(r"(09)(1[0-9]|3[0-9]|2[0-2])([0-9]{7})")
and it works fine for numbers like 0123456789
but if user enter this kind of number ١
, it is not working.
There are also other numbers like: ٠١٢٣٤٥٦٧٨٩
that can be entered.
This is where I use the validation:
TextFormField(
formKey: formKey,
validator: (String? val) {
if (val != null && RegExp(r"1").hasMatch(val)) {
return null;
}
return "Not Valid";
},
)
I’ve also tried this RegExp(r"u06f1")
but it is not working.
How can I validate this kind of numbers?
2
Answers
Thanks to @sln for the useful information. I'm adding my answer to help those who want to use UniCodes in regular expressions in flutter.
Assuming a simple regex to match special kind of UniCode numbers like
ARABIC-INDIC DIGIT
, that looks like this:In validator method of
TextFormField
, just use the regex in validator like this:Here is a list of all Unicode V15 Numeric Digits in the Basic Plane ( 0x0 – 0xffff ).
The columns are the Code Point ( in uDDDD hex format ). the Character and the Unicode Name.
There are 10 items per block. Each block represents a different Language..
You can construct each regex with its corresponding language code points.
Then each regex can be joined with an alternation, or used separately.
This guarantees each validation will meet the range you specify in each respective language.
I recommend you put these into a 2 dimensional array.
[#of languages,10 digits]
This way you can programmatically construct each regex for any language, any numeric range / validation requirements you have.
This is done simply by picking the language index, then digit index (0-9) where the code point value is.
You could even make a template reader that substitutes the code point where needed:
Template =
({0}{9})({1}[{0}-{9}]|{3}[{0}-{9}]|{2}[{0}-{2}])([{0}-{9}]{7})
where any escaped braces are ignored. Capture the number (which is really the digit index)
(?<!\){(d)(?!\)}
replace with the lookup code point value for a particular language.Restoring escaped braces to non-escaped ones takes a little bit more.