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。
我想在我的文本字段中允许这种输入:
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。