Flutter中如何编写符合特定输入规则的RegExp?
Flutter 正则表达式匹配指定允许字符的写法
正则表达式实现
根据需求,需要匹配包含任意人类语言字符、英文数字、下划线、井号,且最多包含一个空格的输入,同时拒绝所有未提及的字符。以下是符合要求的两种实现:
情况1:不允许单独输入空格(输入至少包含一个非空格字符)
final validRegex = RegExp(r'^[\p{L}\d_#]+(?:\s[\p{L}\d_#]+)?$', unicode: true);
情况2:允许单独输入空格(支持单个空格作为合法输入)
final validRegex = RegExp(r'^(?:[\p{L}\d_#]+(?:\s[\p{L}\d_#]+)?|\s)$', unicode: true);
代码用法示例
bool checkInputValidity(String value) { final regex = RegExp(r'^[\p{L}\d_#]+(?:\s[\p{L}\d_#]+)?$', unicode: true); return regex.hasMatch(value); } // 调用示例 void main() { print(checkInputValidity("Hello_#123")); // true print(checkInputValidity("中文测试 456#")); // true print(checkInputValidity("a b")); // true print(checkInputValidity("Hello 123")); // false(连续空格) print(checkInputValidity("Hello!")); // false(包含感叹号) print(checkInputValidity(" ")); // false(情况1下,单独空格不合法) }
正则表达式解析
^和$:限定匹配范围为整个字符串,避免部分匹配\p{L}:匹配任意人类语言的字母字符(包括中文、英文、日文、阿拉伯文等所有Unicode标准中的字母),必须配合unicode: true参数才能生效\d:匹配0-9的英文数字_#:匹配下划线和井号(?:\s[\p{L}\d_#]+)?:非捕获组,匹配“一个空格 + 一个或多个允许的非空格字符”,?表示这部分最多出现一次(确保整个字符串最多一个空格)unicode: true:Flutter的RegExp默认不支持Unicode属性匹配,必须开启此参数才能让\p{L}正常工作
内容的提问来源于stack exchange,提问作者Mohammed Hamdan
相关产品推荐
相关产品推荐

