我正在尝试在正则表达式中传递变量 语言飞镖
`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 ";
}`
谢谢
您不能对原始字符串使用字符串插值。
带插值
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'}$');
一个通用函数,用于 转义您想要放入正则表达式中作为文字模式部分的任何文字字符串 可能看起来像
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"
匹配数字等)如前所述https://stackoverflow.com/a/65008426/6824121
您实际上可以像这样对原始字符串使用字符串插值:
final RegExp nameExp = new RegExp(r'^\w{"' '$min' '","' '$max' r'"}$');