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

问题描述 投票:0回答:3

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

  `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 ";
   }`

谢谢

regex dart flutter
3个回答
19
投票

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

带插值

final RegExp nameExp = new RegExp('^\\w{"$min","$max"}\$');
final RegExp nameExp = new RegExp('^\\w{$min,$max}\$');

串联

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

4
投票

一个通用函数,用于 转义您想要放入正则表达式中作为文字模式部分的任何文字字符串 可能看起来像

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

这是必要的,因为未转义的特殊正则表达式元字符会导致正则表达式编译错误(如不匹配的

(
)
)或可能使模式匹配意外的东西。在 MDN 上查看有关 escaping strings for regex 的更多详细信息。

所以,如果你有

myfile.png
escape('myfile.png')
的输出将是
myfile\.png
并且
.
现在只会匹配文字点字符。

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

你可以直接使用

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!";
}

生成的正则表达式是

^\w{4,20}$
.

注:

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

0
投票

如前所述https://stackoverflow.com/a/65008426/6824121

您实际上可以像这样对原始字符串使用字符串插值:

final RegExp nameExp = new RegExp(r'^\w{"' '$min' '","' '$max' r'"}$');
© www.soinside.com 2019 - 2024. All rights reserved.