Flutter TextField inputFormatters 不适用于我的自定义正则表达式

Flutter TextField inputFormatters not wokring with my custom regex

我想在我的文本字段中允许这种输入:

123
*123#
*123*4#

所以我创建并测试了 RegExr 网站这个正则表达式:

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

但是当我尝试输入时,文本字段中没有输入任何内容

使用代码:

     ...

     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,
     );

您可以使用

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

参见regex demo

详情:

  • ^ - 字符串开头
  • \*? - 一个可选的 * 字符
  • (?:\d+\*?(?:\d+#?)?)? - 一个可选的序列
    • \d+ - 一位或多位数字
    • \*? - 一个可选的 *
  • (?:\d+#?)? - 一个或多个数字的可选序列和一个可选的 # char
  • $ - 字符串结尾。

如果您还想匹配单个数字的变体,例如 *1#,您可以使用否定前瞻,排除不存在的内容:

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

说明

  • ^ 字符串开头
  • (?! 否定前瞻,断言右边不是
    • .*\*[*#] 匹配 ***#
    • |
    • \d*#$匹配字符串末尾的可选数字和#
  • ) 关闭前瞻
  • [*\d]*#? 匹配可选的 * 个字符或数字和可选的 #
  • $ 字符串结束

看到一个regex demo