记录常用的正则表达式
验证密码正则
请输入8-16位包含至少两种:数字、字母、特殊符号的密码
/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9a-zA-Z-`=[\];',.~!@#$%^&*()_+|{}:"?]{8,16}$/
请输入8-16位数字和字母组合的密码
/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/
密码为8~16位,至少包含大写字母/小写字母/数字/特殊符号中的三项
/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,16}$/
英文+数字组合,支持纯英文,不能带任何符号
/^(?![0-9]+$)[0-9A-Za-z]{1,30}$/
验证邮箱正则
/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,5}$/
验证手机号正则
/^1[0-9][0-9]{9}$/
文字高亮匹配
const getTable = () => {
state.loading = true
$http[state.listApi](state.page).then(res => {
if (res.code === 0) {
res.data.data.forEach(item => {
// 高亮显示
if (state.searchValue) {
item.title_html = item.title
const escapedSearchValue = state.searchValue.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
const _reg = new RegExp(escapedSearchValue, 'g')
item.title_html = item.title_html.replace(
_reg,
`<span style="color: #00BCA8;">${
state.searchValue}</span>`
)
} else {
item.title_html = undefined
}
})
state.tableData = res.data.data
state.total = res.data.total
state.loading = false
}
})
}
验证IPV4、IPV6
/**代码省略**/
<Form.Item
label="IP"
name="ip_config"
//自定义检验规则
rules={
[{
required: true }, {
validator: checkTextAreaIp }]}
>
<TextArea
style={
{
width: '100%' }}
placeholder="请输入机构IP"
rows={
10}
/>
</Form.Item>
/**代码省略**/
let ipRegex =
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$/;
function checkTextAreaIp(rule: any, value: any, callback: any) {
if (value) {
const passArr: any = []; // 已经检查通过的IP
const valueArr = value.split('\n');
try {
Array.isArray(valueArr) &&
valueArr.forEach((ip, index) => {
const lineText = `第${
index + 1}行[${
ip}]`;
if (!ip) {
throw lineText + '不能为空';
}
// 校验去重
if (passArr.indexOf(ip) !== -1) {
throw lineText + '已重复';
}
// 如果有 - ,分开校验
if (ip.indexOf('-') > -1) {
const ips = ip.split('-');
for (let i = 0; i < ips.length; i++) {
if (!ipRegex.test(ips[i])) {
throw (
lineText +
'请输入正确的IP/IP段。例,192.168.1.1-192.168.1.50'
);
}
}
// 将 IP 地址表示从点分十进制转换为一个单一的数字
function convertIPToNumber(e: any) {
return e.split('.').reduce((acc: any, e: any) => {
return (acc << 8) + Number(e);
}, 0);
}
// 校验前后2个ip的大小关系
const ip1Number = convertIPToNumber(ips[0]);
const ip2Number = convertIPToNumber(ips[1]);
if (ip1Number >= ip2Number) {
throw lineText + '网段截止IP必须大于网段起始IP';
}
} else if (ip.indexOf('/') > -1) {
const ips = ip.split('/');
// 校验第一个 ip
if (!ipRegex.test(ips[0])) {
throw lineText + '请输入正确的IP/IP段';
}
// 校验子网掩码
if (!ips[1] || isNaN(ips[1])) {
callback('请输入正确的IP/IP段');
}
// 这里把 0 排除掉
if (ips[1] > 0) {
throw lineText + '请输入正确的IP/IP段';
}
} else if (!ipRegex.test(ip)) {
throw lineText + '请输入正确的IP/IP段';
}
passArr.push(ip);
});
} catch (e) {
callback(e);
} finally {
callback();
}
} else {
callback();
}
}