在 dart 中使用动态(可变)字符串作为正则表达式模式

use*_*949 9 regex dart flutter

我正在尝试在正则表达式语言 DART 中传递变量

  `betweenLenth(val, field, [min = 4, max = 20]) {
     final RegExp nameExp = new RegExp(r'^\w{" + min + "," + max + "}$');
     if (!nameExp.hasMatch(val))
     return field + " must be between $min - $max characters ";
   }`
Run Code Online (Sandbox Code Playgroud)

谢谢

Gün*_*uer 8

您不能对原始字符串使用字符串插值。

带插值

final RegExp nameExp = new RegExp('^\\w{"$min","$max"}\$');
final RegExp nameExp = new RegExp('^\\w{$min,$max}\$');
Run Code Online (Sandbox Code Playgroud)

有串联

final RegExp nameExp = new RegExp(r'^\w{"' + min + '","' + max + r'"}$');
final RegExp nameExp = new RegExp(r'^\w{' + min + ',' + max + r'}$');
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 4

用于转义要作为文字模式部分放入正则表达式中的任何文字字符串的通用函数可能如下所示

escape(String s) {
  return s.replaceAllMapped(RegExp(r'[.*+?^${}()|[\]\\]'), (x) {return "\\${x[0]}";});
}
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为未转义的特殊正则表达式元字符要么会导致正则表达式编译错误(如不匹配()),要么可能使模式匹配意外的内容。有关正则表达式转义字符串的更多详细信息,请参阅MDN。

因此,如果有myfile.png,则 will 的输出escape('myfile.png')将是myfile\.png,并且.will 现在仅匹配文字点字符。

在当前场景中,您不必使用此函数,因为最大和最小阈值用数字表示,并且数字不是特殊的正则表达式元字符。

你可以只使用

betweenLenth(val, field, [min = 4, max = 20]) {
     final RegExp nameExp = new RegExp("^\\w{$min,$max}\$");
     if (!nameExp.hasMatch(val))
            return field + " must be between $min - $max characters ";
     return "Correct!";
}
Run Code Online (Sandbox Code Playgroud)

生成的正则表达式是^\w{4,20}$.

笔记:

  • 使用非原始字符串文字以便使用字符串插值
  • 转义常规字符串文字中字符串锚点的末尾以定义文字$字符
  • 使用双反斜杠定义正则表达式转义序列("\\d"以匹配数字等)