Dart 正则表达式

3,633 阅读2分钟

正则字符类(只匹配一个字符)

[abc]              只能是a,b,或c
[^abc]             除了a,b,c之外的任何字符
[a-zA-Z]           a到zA到Z,包括(范围)
[a-d[m-p]]         a到d,或m到p
[a-z&&[def]]       d,e,或f(交集)
[a-z&&[^bc]]       a到z,除了b和c(等同于[ad-z])
[a-z&&[^m-p]]      a到z,除了m到p(等同于[a-lq-z])

正则预定义字符(只匹配一个字符)

.       任何字符
\b      一个数字:[0-9]
\D      非数字:[^0-9]
\s      一个空白字符:[\t\n\x0B\f\r]       --小写
\S      非空白字符:[^\s]                  --大写
\w      [a-zA-Z_0-9]英文、数字、下划线     --小写
\W      [^\w]一个非单词字符                --大写

正则数量词

X?         X,一次或0次
X*         X,零次或多次
X+         X,一次或多次
X{n}       X,正好n次
X {n, }    X,至少n次
X {n,m}    X,至少n但不超过m次
注:  在正则表达式中 \\中前面的\只是一个转义字符,改变后面的\原本的含义,把后面的\变为一个普通的\
例:  以字符串的形式打印一个双引号
print(" \'' ");
输出结果为 '';

正则符号

符号含义举例
[]里面的内容出现一次[0-9] [a-zA-Z0-9]
()分组a(bc)+
٨取反[^abc]
&&交集,不能写单个的&[a-z&&m-p]
|写在方括号外面表示并集[a-zA-Z0-9] x|X
.任意字符回车符号不匹配
\转义字符\d
\d0-9\d+
\D非0-9\D+
\s(小写)空白字符[\t\n\x0B\f\r]
\S非空白字符[^\s]
\w(小写)单词字符[a-zA-Z_0-9]
\W非单词字符[^\w]
?0次或1次\d?
*0次或多次\d* (abc)*
+1次或多次a(bc)+
{}具体次数a{7} \d{7,19}
(?i)忽略后面字符的大小写(?i)abc
a((?i)b)c只忽略b的大小写a((?i)b)c

正则示例

Dart 正则表达式验证手机号码

输入String类型的电话号码,例:String phoneNumber = '13888888888';

验证

RegExp exp = RegExp( r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$');
bool matched = exp.hasMatch(mobileTextController.text);
返回true即为正确号码

隐藏部分号码转星号使用

String phoneNumberStr = phoneNumber.replaceFirst(new RegExp(r'\d{4}'), '****', 3);

验证手机号码邮箱

bool emailVerification({String email}) {
  if (email == null || email.isEmpty) return false;
  String regexEmail = "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";
  bool _regExp = RegExp(regexEmail).hasMatch(email);
  return _regExp;
}

正则去掉小数点后的0

String a = 12.20;
String b = 12.0;

a = a.replaceAll(RegExp(r"([.]*0)(?!.*\d)"), "");// 12.2
b = b.replaceAll(RegExp(r"([.]*0)(?!.*\d)"), "");//12

限制表情输入

inputFormatters: [
FilteringTextInputFormatter.allow(RegExp("[a-zA-Z]|[\u4e00-\u9fa5]|[0-9]|[ ]")),//限制表情的输入 
LengthLimitingTextInputFormatter(15),//限制输入框输入的字符长度 
],

as和idea的正则插件: any-rule