【问题标题】:Use dynamic (variable) string as regex pattern in dart在飞镖中使用动态(可变)字符串作为正则表达式模式
【发布时间】:2018-05-16 12:14:08
【问题描述】:

我正在尝试在正则表达式中传递变量 语言 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 ";
   }`

谢谢

【问题讨论】:

  • 双引号应该在生成的 rexex 模式中吗?您能否添加所需的结果?
  • 试试final RegExp nameExp = new RegExp(r'^\w{' + min + ',' + max + r'}$');

标签: regex dart flutter


【解决方案1】:

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

带插值

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'}$');

【讨论】:

    【解决方案2】:

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

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

    这是必要的,因为未转义的特殊正则表达式元字符要么导致正则表达式编译错误(如不匹配的()),要么可能使模式匹配意外。在 MDN 上查看有关 escaping strings for regex 的更多详细信息。

    所以,如果你有 myfile.pngescape('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" 匹配数字等)

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2022-01-22
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多