首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在TextFormField中不允许连续的同一个字符和一些不同的字符在一起

在TextFormField中不允许连续的同一个字符和一些不同的字符在一起
EN

Stack Overflow用户
提问于 2022-10-04 21:07:14
回答 2查看 72关注 0票数 0

我想限制TextFormField只接受以逗号分隔的数字,有时用破折号分隔,但我不希望它们彼此连续,也不希望它们连续使用相同的字符。

例:-

  • 1,3-4,9-11是正确的
  • 1,,3--4,9-11错了
  • 1,-3-4,9-11错了
  • 1-,3-4,9-11错了

限制只使用数字、逗号和破折号:-

代码语言:javascript
运行
复制
FilteringTextInputFormatter(
   RegExp("[0-9,-]"),
   allow: true
)

但是,它并没有像示例中的错误行为那样限制连续行为。

那么,如何将我的TextFormField限制在示例中表示的正确行为上呢?

谢谢。

更新:对于这个问题,我最终采用了方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-04 21:10:11

如果要在提交时进行验证,可以将模式编写为:

代码语言:javascript
运行
复制
^[0-9]+(?:[,-][0-9]+)*$

Regex演示

如果支持负前瞻性,则在输入验证时,可以进行2次-,的排除匹配。

请注意,这将允许,-在结尾处:

代码语言:javascript
运行
复制
^(?!.*[,-][,-])[0-9,-]*

Regex演示

票数 1
EN

Stack Overflow用户

发布于 2022-10-04 22:47:32

对于上面的问题,我最终将FilteringTextInputFormatter与特定于我的情况的自定义TextInputFormatter结合在一起,所以我在下面添加它,这样如果有人想做同样的事情,他们可以看看这个方法:

代码语言:javascript
运行
复制
class RangeTextInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
    TextEditingValue oldValue,
    TextEditingValue newValue,
  ) {
    TextSelection newSelection = newValue.selection;
    String truncated = newValue.text;

    int oldValueLength = oldValue.text.length;
    int newValueLength = newValue.text.length;

    // Blocks comma and dash at start.
    if ((oldValue.text.isEmpty || oldValue.text == "") &&
        (newValue.text[newValueLength - 1] == "," ||
            newValue.text[newValueLength - 1] == "-")) {
      truncated = oldValue.text;
      newSelection = oldValue.selection;
    }
    // Allows numbers at start.
    else if (oldValue.text.isEmpty || oldValue.text == "") {
      truncated = newValue.text;
      newSelection = newValue.selection;
    } else {
      // Blocks comma and dash after comma.
      if (oldValue.text[oldValueLength - 1] == "," &&
          (newValue.text[newValueLength - 1] == "," ||
              newValue.text[newValueLength - 1] == "-")) {
        truncated = oldValue.text;
        newSelection = oldValue.selection;
      }
      // Blocks comma and dash after dash.
      else if (oldValue.text[oldValueLength - 1] == "-" &&
          (newValue.text[newValueLength - 1] == "," ||
              newValue.text[newValueLength - 1] == "-")) {
        truncated = oldValue.text;
        newSelection = oldValue.selection;
      }
      // Blocks dash after number dash number. Ex: 48-58- <- this last dash is blocked
      else if (oldValue.text.lastIndexOf('-') != -1) {
        if (!(oldValue.text
                .substring(oldValue.text.lastIndexOf('-'))
                .contains(",")) &&
            newValue.text[newValueLength - 1] == "-") {
          truncated = oldValue.text;
          newSelection = oldValue.selection;
        }
      }
    }

    return TextEditingValue(
      text: truncated,
      selection: newSelection,
      composing: TextRange.empty,
    );
  }
}

现在就像使用FilteringTextInputFormatter一样使用它

代码语言:javascript
运行
复制
inputFormatters: [
      FilteringTextInputFormatter(RegExp("[0-9,-]"), allow: true),
      RangeTextInputFormatter(),
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73953651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档