Burhan Khanzada
Burhan Khanzada

Reputation: 1076

Flutter TextField inputFormatters not wokring with my custom regex

I want to allow this kind of input to my text field:

123
*123#
*123*4#

so I created and tested RegExr website this regex:

\**\d+\**\d+\#?

but when i try to type nothing is typed in the text field

code of using:

     ...

     keyboardType = TextInputType.phone;

     // to allow digits with asterik and hash
     final regex = RegExp(r'\**\d+\**\d+\#?');

     inputFormatters = [FilteringTextInputFormatter.allow(regex)];

     return TextField(
      ...
      keyboardType: keyboardType,
      inputFormatters: inputFormatters,
     );

Upvotes: 2

Views: 1220

Answers (2)

The fourth bird
The fourth bird

Reputation: 163217

If you also want to match a variation with a single digit like *1# you might use a negative lookahead excluding what can not be present:

^(?!.*\*[*#]|\d*#$)[*\d]*#?$

Explanation

  • ^ Start of string
  • (?! Negative lookahead, assert what to the right is not
    • .*\*[*#] Match either ** or *#
    • | Or
    • \d*#$ Match optional digits and # at the end of the string
  • ) Close lookahead
  • [*\d]*#? Match optional * chars or digits and optional #
  • $ End of string

See a regex demo.

Upvotes: 1

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626738

You can use

^\*?(?:\d+\*?(?:\d+#?)?)?$

See the regex demo.

Details:

  • ^ - start of string
  • \*? - an optional * char
  • (?:\d+\*?(?:\d+#?)?)? - an optional sequence of
    • \d+ - one or more digits
    • \*? - an optional *
  • (?:\d+#?)? - an optional sequence of one or more digits and an optional # char
  • $ - end of string.

Upvotes: 1

Related Questions