从GetX的GetUtils中抽取出来的一个正则小工具集合
class RegExpUtils {
RegExpUtils._();
static bool isNumericOnly(String s) => hasMatch(s, r'^\d+$');
static bool isAlphabetOnly(String s) => hasMatch(s, r'^[a-zA-Z]+$');
static bool hasCapitalletter(String s) => hasMatch(s, r'[A-Z]');
static bool isUsername(String s) =>
hasMatch(s, r'^[a-zA-Z0-9][a-zA-Z0-9_.]+[a-zA-Z0-9]$');
static bool isURL(String s) => hasMatch(s,
r"^((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))://)?(www.|[a-zA-Z0-9].)[a-zA-Z0-9-.]+.[a-zA-Z]{2,6}(:[0-9]{1,5})*(/($|[a-zA-Z0-9.,;?'\+&%$#=~_-]+))*$");
static bool isEmail(String s) => hasMatch(s,
r'^(([^<>()[]\.,;:\s@"]+(.[^<>()[]\.,;:\s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$');
static bool isPhoneNumber(String s) {
if (s.length > 16 || s.length < 9) return false;
return hasMatch(s, r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s./0-9]*$');
}
static bool isDateTime(String s) =>
hasMatch(s, r'^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}.\d{3}Z?$');
static bool isMD5(String s) => hasMatch(s, r'^[a-f0-9]{32}$');
static bool isSHA1(String s) =>
hasMatch(s, r'(([A-Fa-f0-9]{2}:){19}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{40})');
static bool isSHA256(String s) =>
hasMatch(s, r'([A-Fa-f0-9]{2}:){31}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{64}');
static bool isSSN(String s) => hasMatch(s,
r'^(?!0{3}|6{3}|9[0-9]{2})[0-9]{3}-?(?!0{2})[0-9]{2}-?(?!0{4})[0-9]{4}$');
static bool isBinary(String s) => hasMatch(s, r'^[0-1]+$');
static bool isIPv4(String s) =>
hasMatch(s, r'^(?:(?:^|.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$');
static bool isIPv6(String s) => hasMatch(s,
r'^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b).){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b).){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b).){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$');
///检查string是否是十六进制。
/// 示例: HexColor => #12F
static bool isHexadecimal(String s) =>
hasMatch(s, r'^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$');
static bool isPalindrom(String string) {
final cleanString = string
.toLowerCase()
.replaceAll(RegExp(r"\s+"), '')
.replaceAll(RegExp(r"[^0-9a-zA-Z]+"), "");
for (var i = 0; i < cleanString.length; i++) {
if (cleanString[i] != cleanString[cleanString.length - i - 1]) {
return false;
}
}
return true;
}
static bool isPassport(String s) =>
hasMatch(s, r'^(?!^0+$)[a-zA-Z0-9]{6,9}$');
static bool isCurrency(String s) => hasMatch(s,
r'^(S?$|\₩|Rp|\¥|\€|\₹|\₽|fr|R$|R)?[ ]?[-]?([0-9]{1,3}[,.]([0-9]{3}[,.])*[0-9]{3}|[0-9]+)([,.][0-9]{1,2})?( ?(USD?|AUD|NZD|CAD|CHF|GBP|CNY|EUR|JPY|IDR|MXN|NOK|KRW|TRY|INR|RUB|BRL|ZAR|SGD|MYR))?$');
static bool isCnpj(String cnpj) {
final numbers = cnpj.replaceAll(RegExp(r'[^0-9]'), '');
if (numbers.length != 14) {
return false;
}
if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) {
return false;
}
final digits = numbers.split('').map(int.parse).toList();
var calcDv1 = 0;
var j = 0;
for (var i in Iterable<int>.generate(12, (i) => i < 4 ? 5 - i : 13 - i)) {
calcDv1 += digits[j++] * i;
}
calcDv1 %= 11;
final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1;
if (digits[12] != dv1) {
return false;
}
var calcDv2 = 0;
j = 0;
for (var i in Iterable<int>.generate(13, (i) => i < 5 ? 6 - i : 14 - i)) {
calcDv2 += digits[j++] * i;
}
calcDv2 %= 11;
final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2;
if (digits[13] != dv2) {
return false;
}
return true;
}
static bool isCpf(String cpf) {
final numbers = cpf.replaceAll(RegExp(r'[^0-9]'), '');
if (numbers.length != 11) {
return false;
}
if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) {
return false;
}
final digits = numbers.split('').map(int.parse).toList();
var calcDv1 = 0;
for (var i in Iterable<int>.generate(9, (i) => 10 - i)) {
calcDv1 += digits[10 - i] * i;
}
calcDv1 %= 11;
final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1;
if (digits[9] != dv1) {
return false;
}
var calcDv2 = 0;
for (var i in Iterable<int>.generate(10, (i) => 11 - i)) {
calcDv2 += digits[11 - i] * i;
}
calcDv2 %= 11;
final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2;
if (digits[10] != dv2) {
return false;
}
return true;
}
static final RegExp _upperAlphaRegex = RegExp(r'[A-Z]');
static final _symbolSet = {' ', '.', '/', '_', '\', '-'};
static List<String> _groupIntoWords(String text) {
var sb = StringBuffer();
var words = <String>[];
var isAllCaps = text.toUpperCase() == text;
for (var i = 0; i < text.length; i++) {
var char = text[i];
var nextChar = i + 1 == text.length ? null : text[i + 1];
if (_symbolSet.contains(char)) {
continue;
}
sb.write(char);
var isEndOfWord = nextChar == null ||
(_upperAlphaRegex.hasMatch(nextChar) && !isAllCaps) ||
_symbolSet.contains(nextChar);
if (isEndOfWord) {
words.add('$sb');
sb.clear();
}
}
return words;
}
static String numericOnly(String s, {bool firstWordOnly = false}) {
var numericOnlyStr = '';
for (var i = 0; i < s.length; i++) {
if (isNumericOnly(s[i])) {
numericOnlyStr += s[i];
}
if (firstWordOnly && numericOnlyStr.isNotEmpty && s[i] == " ") {
break;
}
}
return numericOnlyStr;
}
static bool hasMatch(String? value, String pattern) {
return (value == null) ? false : RegExp(pattern).hasMatch(value);
}
}