一个用于匹配名称和数字的Dart正则表达式

20

我需要验证一个表单,用户提供他们的名字和一个数字。我有一个正则表达式,它应该确保名称只包含字母,而没有其他任何字符,并且对于数字输入,我需要确保字段中只有数字。 我已经有的代码看起来像这样:

 validator: (value) => value.isEmpty
                        ? 'Enter Your Name'
                        : RegExp(
                                '!@#<>?":_``~;[]\|=-+)(*&^%1234567890')
                            ? 'Enter a Valid Name'
                            : null,

我能否得到一个正则表达式,它以这样的方式验证名称,如果输入任何特殊字符或数字,则变为错误,意味着只有字母是有效的,并且另一个验证数字的正则表达式,以这样的方式验证数字,如果输入字母或任何特殊字符,则会变成错误,意味着只输入数字是有效的。


看起来你想使用 RegExp(r'[!@#<>?":_\~;[]\|=+)(*&^%0-9-]').hasMatch(value)。你需要使用原始字符串字面量,在末尾加上 -并转义]` 字符,然后使用 .hasMatch(value) 检查是否匹配。[0123456789] = [0-9] - Wiktor Stribiżew
这适用于名字的正则表达式。你能解释一下数字的那个吗?在这个中,用户将被呈现出数字键盘,所以有些字符并不重要。我只是复制了名字的正则表达式并将其粘贴到这里,但删除了 0-9 以便能够输入数字。问题是,当插入一个空格时,它仍然会将其视为一个值。我应该如何更正这个问题? - Taio
添加\s - r'[!@#<>?":_\~;[]\|=+)(*&^%\s-]'` - Wiktor Stribiżew
是的,这个可以。你可以添加答案。 - Taio
5个回答

25
创建一个静态的 final 字段来保存 RegExp,以避免每次检查值时都创建一个新实例。创建 RegExp 是非常耗费资源的。
static final RegExp nameRegExp = RegExp('[a-zA-Z]'); 
    // or RegExp(r'\p{L}'); // see https://dev59.com/RXA65IYBdhLWcg3wzyL8 
static final RegExp numberRegExp = RegExp(r'\d');

然后像这样使用它

validator: (value) => value.isEmpty 
    ? 'Enter Your Name'
    : (nameRegExp.hasMatch(value) 
        ? null 
        : 'Enter a Valid Name');

1
两个都不起作用。在问题中,我指定需要的是仅接受字母字符的名称,而对于数字输入,则仅限数字,不能有特殊字符或其他任何内容。这个正则表达式真的很让人感到压力。 - Taio
例如,对于名称如果某处出现了逗号,则会变错。 - Taio
你要求“只有字母”。你是否检查了被注释掉的替代方案?如果这不是你想要的,请更精确地阐述你的问题。 - Günter Zöchbauer
我已经编辑了原始问题以进一步解释。请原谅。 - Taio
我仍然认为我的回答如何不回答你的问题还不清楚。 RegExp('[a-zA-Z\ ]') 对我的名字进行验证,结果为true - Günter Zöchbauer

17

我觉得你想要什么。

RegExp(r'[!@#<>?":_`~;[\]\\|=+)(*&^%0-9-]').hasMatch(value)
注意需要使用原始字符串字面量,将-放在结尾并转义结果为字符类内的]\字符,然后使用.hasMatch(value)检查是否匹配。请注意,[0123456789][0-9]相同。
至于第二个模式,您可以从正则表达式中删除数字范围(因为您需要允许它),并添加\s模式(\s匹配任何空格字符)以禁止输入中的空格。
RegExp(r'[!@#<>?":_`~;[\]\\|=+)(*&^%\s-]').hasMatch(value)

有些人在婚后会将姓氏合并,使得他们的名字包含一个连字符。你知道如何将连字符(-)设为例外吗? - Texv
不要忘记在 RegExp(r'[!@#<>?"/·:_`~;[]\|=+)(*&^%0-9-]') 中添加 /。 - PatricioS

8

很棒,甚至允许在名称之间使用连字符。 - RobbB
这是唯一一个适用于我的情况的。谢谢。 - pythonGo

3

这对我有用

void main() {
  RegExp nameRegex = RegExp(r"^[a-zA-Z]+$");
  RegExp numberRegex = RegExp(r"^\d+$");
  print(nameRegex.hasMatch("Ggggg"));
  print(numberRegex.hasMatch("999"));
}

0
以下代码也应该可以运行。
解析器是一个常量表达式,它很快且不占用太多内存。
import 'package:parser_combinator/parser/alpha1.dart';
import 'package:parser_combinator/parser/digit1.dart';
import 'package:parser_combinator/parser/eof.dart';
import 'package:parser_combinator/parser/many1.dart';
import 'package:parser_combinator/parser/predicate.dart';
import 'package:parser_combinator/parser/skip_while.dart';
import 'package:parser_combinator/parser/terminated.dart';
import 'package:parser_combinator/parsing.dart';

void main(List<String> args) {
  const name = Terminated(
    Many1(
      Terminated(Alpha1(), SkipWhile(isWhitespace)),
    ),
    Eof(),
  );

  const number = Terminated(Digit1(), Eof());

  final input1 = 'John  Snow '.trim();
  final r1 = tryParse(name.parse, input1).result;
  if (r1 != null) {
    final fullName = r1.value;
    print('Name is valid: $input1');
    print('First name: ${fullName.first}');
    if (fullName.length > 1) {
      print('Second name: ${fullName[1]}');
    }
  }

  final input2 = ' 123 '.trim();
  final r2 = tryParse(number.parse, input2).result;
  if (r2 != null) {
    print('Number is valid: $input2');
  }
}

输出:

Name is valid: John  Snow
First name: John
Second name: Snow
Number is valid: 123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接