regex - 是否可以将文本转换为正则表达式?

标签 regex flutter dart

例如我有这个文本

  1. 1.2345

  2. 12.345

所以我的输入表单必须遵循上面的格式。是否可以动态填充正则表达式。例如,我们将使用格式编号 1

用户输入12.345所以会返回false,但是当用户输入5.5555时会返回true,但当用户输入 1.23 时,它将返回 true 并且数字将变为 1.2300

在 JavaScript 中,我正在这样做

var inputVal = $(this).val();
        if (inputVal == "") return;
        if (inputVal.indexOf('.') !== -1) {
            var inputValSplitdot = inputVal.split(".");
            var inputFormatSplitDot = inputFormat.split(".");
            if (inputValSplitdot[1].length < inputFormatSplitDot[1].length) {
                var compareResult = inputFormatSplitDot[1].length - inputValSplitdot[1].length
                var zeroItem = "0".repeat(compareResult);
                $(this).val(inputVal + zeroItem);
            }
        } else {
            $(this).val(inputVal + ".").change();
        }

如何在 flutter/dart 中实现目标?提前致谢

最佳答案

这个问题在 Flutter 中可以优雅地解决。

demo gif

首先,在InputFormatter中使用RegEx来确保用户只能输入数字(0-9)和小数点(.),而不能输入任何其他字符

inputFormatters: [
  // Make sure user can only enter numbers and decimal points
  FilteringTextInputFormatter.allow(RegExp(r'[0-9\.]')),
],

其次,将输入的总长度限制为6,这样用户就不能输入超过这个长度的内容:

maxLength: 6

(完成此操作后,Flutter 会自动添加一个计数器,如果您不需要该计数器,可以通过设置 counterText: '' 轻松禁用它。)

最后,使用 TextEditingController 监视输入,并检查输入的值是否有效且在范围内:

bool isValid(String input) {
  if (input.isEmpty) return true; // initial empty string is okay
  final number = double.tryParse(input); // try to parse the string
  if (number == null) return false; // parse failed: invalid format
  if (number >= 100) return false; // range failed: larger than 99.999
  return true;
}

完整源代码:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("TextField Demo")),
      body: Center(
        child: SizedBox(
          width: 200,
          child: VerifiedTextField(),
        ),
      ),
    );
  }
}

class VerifiedTextField extends StatefulWidget {
  @override
  _VerifiedTextFieldState createState() => _VerifiedTextFieldState();
}

class _VerifiedTextFieldState extends State<VerifiedTextField> {
  final _controller = TextEditingController();
  bool _valid = true;

  @override
  void initState() {
    _controller.addListener(() {
      final valid = isValid(_controller.text);
      setState(() => _valid = valid);
    });
    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _controller,
      inputFormatters: [
        // Make sure user can only enter numbers and decimal points
        FilteringTextInputFormatter.allow(RegExp(r'[0-9\.]')),
      ],
      maxLength: 6,
      decoration: InputDecoration(
        errorText: _valid ? null : "Incorrect Format",
        // counterText: '', // apply this code, if you don't want a counter
      ),
    );
  }

  bool isValid(String input) {
    if (input.isEmpty) return true; // initial empty string is okay
    final number = double.tryParse(input); // try to parse the string
    if (number == null) return false; // parse failed: invalid format
    if (number >= 100) return false; // range failed: larger than 99.999
    return true;
  }
}

当然,如果您更喜欢按照 JS 中的方式进行操作,则可以相应地修改 isValid 函数。

关于regex - 是否可以将文本转换为正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68798234/

相关文章:

javascript - 如何为 id 验证编写正则表达式(JavaScript)?

firebase - 如何在 Flutter 中基于 Future 结果构建 Stream?

user-interface - 如何在同心圆Flutter中对齐我的Neumorphic小部件?

regex - emacs 贪婪搜索向后正则表达式

mysql - 如何转义 mysql REGEXP 中的方括号?

flutter - RenderFlex 溢出错误只出现在小部件测试中,如果我运行应用程序一切正常

flutter - 如何使Fluke的Custom拇指图杆出现?

android - 如何制作此布局并使用容器制作应用栏

json - 如何解析嵌套的JSON字典( map )

javascript - 正则表达式,从字符串中选择第一个数字