以下方法可直接用于antd from 的验证
使用方式
引入
<template>
<div>
<a-modal :visible="props.visible" :title="props.title" @ok="handleOk" @cancel="handleCancel" width="900px">
<template #footer>
<a-button key="back" @click="handleCancel">取消</a-button>
<a-button key="submit" type="primary" @click="handleOk">确认</a-button>
</template>
<a-form name="custom-validation" ref="formRef" :model="formState" :rules="rules" v-bind="layout">
<a-row>
<a-col :span="12">
<a-form-item label="姓名" name="name">
<a-input v-model:value="formState.name" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="联系电话" name="phoneNumber">
<a-input v-model:value="formState.phoneNumber" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="证件类型" name="idType">
<a-select v-model:value="formState.idType" placeholder="请选择">
<a-select-option value="1">身份证</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="证件号" name="idNumber">
<a-input v-model:value="formState.idNumber" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="所属部门" name="departmentId">
<a-select v-model:value="formState.departmentId" placeholder="请选择部门">
<a-select-option value="shanghai">Zone one</a-select-option>
<a-select-option value="beijing">Zone two</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="职位" name="position">
<a-select v-model:value="formState.position" placeholder="请选择部门">
<a-select-option value="1">总经理</a-select-option>
<a-select-option value="2">普通员工</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="在职状态" name="employmentStatus">
<a-select v-model:value="formState.employmentStatus" placeholder="请选择">
<a-select-option value="0">已离职</a-select-option>
<a-select-option value="1">实习期</a-select-option>
<a-select-option value="2">试用期</a-select-option>
<a-select-option value="3">正式工</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="离职时间" name="resignation">
<a-date-picker v-model:value="formState.resignation" value-format="YYYY-MM-DD"
style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="离职原因">
<a-input v-model:value="formState.resignationReason" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="离职文件">
<div>
<a-button>选择文件</a-button>
<span>未选择任何文件</span>
</div>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="工号">
<a-input v-model:value="formState.employeeNumber" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="银行账户">
<a-input v-model:value="formState.bankAccount" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="企业邮箱">
<a-input v-model:value="formState.corporateEmail" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="分机号">
<a-input v-model:value="formState.extensionNumber" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="入职时间" name="hireDate">
<a-date-picker v-model:value="formState.hireDate" value-format="YYYY-MM-DD"
style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="关联后台账号">
<a-input v-model:value="formState.associatedAccount" />
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-modal>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from "vue"
import { message } from 'ant-design-vue';
import { verifyPhone, validateIdCard, verifyEmail } from '@/utils/verificate.ts'
import { employeeAdd, employeeEdit } from "@/api/personnelMag"
interface Props {
visible: boolean
title: string
type: string
row: object
}
const props = defineProps<Props>()
const $emit = defineEmits(["closeModal", "hendleOk"])
const formRef = ref()
const formState = reactive({
associatedAccount: '',// 关联账号
bankAccount: '',// 银行账户
bankName: '',// 银行名称
corporateEmail: '',// 企业邮箱
createdBy: '',// 创建人 新增必填
departmentId: '',// 部门ID
employeeNumber: '',// 工号
employmentStatus: '',// 在职状态(1 实习期,2 试用期,3正式工,0 已离职)
epId: '',// 企业id
extensionNumber: '',// 分机号
hireDate: '',// 入职时间
id: '',// id 修改时必填
idNumber: '',// 证件号
idType: '',// 证件类型( 1 目前仅身份证)
name: '',// 员工姓名
openingBank: '',// 开户行
phoneNumber: '',// 联系电话
position: '',// 职位(1总经理,2普通员工)
resignationDocumentUrl: '',// 离职文件URL
resignationReason: '',// 离职原因
updatedBy: '',// 修改人 修改必填
resignation: '',
})
const layout = {
labelCol: { span: 6 },
wrapperCol: { span: 16 },
}
const rules = {
departmentId: [{ required: true, message: "请输入", trigger: "blur" }],
employmentStatus: [{ required: true, message: "请选择", trigger: "blur" }],
epId: [{ required: true, message: "请选择", trigger: "blur" }],
hireDate: [{ required: true, message: "请选择", trigger: "blur" }],
idNumber: [{ required: true, trigger: "blur", validator: validateIdCard }],
idType: [{ required: true, message: "请选择", trigger: "change" }],
name: [{ required: true, message: "请输入", trigger: "blur" }, { validator: '' }],
phoneNumber: [{ required: true, message: "", trigger: "blur" }, { validator: verifyPhone }],
position: [{ required: true, message: "请选择", trigger: "change" }],
}
const handleCancel = () => {
console.log("ppp")
$emit("closeModal")
formRef.value.resetFields()
}
const handleOk = () => {
formRef.value
.validate()
.then(async () => {
// 当邮箱有值的时候校验
if (formState.corporateEmail && !verifyEmail(formState.corporateEmail)) {
message.error('请输入正确的邮箱')
return
}
let result;
if (props.type === 'add') {
result = await employeeAdd({ ...formState })
} else {
result = await employeeEdit({ ...formState })
}
console.log("result", result, formState)
})
.catch(() => {
message.error('请注意必输值')
})
}
</script>
1、手机号验证
//验证手机号
export function verifyPhone(rule: any, value: any, callback: any) {
let reg = /^[1][2,3, 4, 5, 6, 7, 8, 9][0-9]{9}$/
if (!reg.test(value)) {
return callback(new Error("请输入正确的手机号码"))
}
return callback()
}
2、身份证验证
export function validateIdCard(rule: any, value: any, callback: any) {
let reg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
let parity = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2]
let code = value.substring(17)
if (reg.test(value)) {
let sum = 0
for (let i = 0; i < 17; i += 1) {
sum += value[i] * factor[i]
}
if (parity[sum % 11].toString() === code.toUpperCase()) {
return callback()
}
}
return callback(new Error("请输入正确的身份证号"))
}
3、邮箱验证
如果不是必填项可这样使用
export function verifyEmail(value: any) {
let reg = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/
if (!reg.test(value)) {
return false
}
return true
}
'cm':/^((13[0-9])|(15[0-9])|(147)|(17[0-9])|(18[0-9]))\d{8}$/,//自定义手机号验证,请输入以13、14、15、17、18开头的手机号码
'idCard': /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/,//身份证号
'passport':/^([a-zA-Z]\d{8}|[a-zA-Z]{2}\d{7})$/,//护照
'officialOfCard':/^[军][0-9]{7}$/,//军官证
'nl':/^[0-9a-zA-Z]+$/, //只能输入字母和数字
'nl1-45':/^[0-9a-zA-Z]{1,45}$/, //只能输入字母和数字
'need1':function(gets,obj,curform,regxp){
var need=1,
numselected=curform.find("input[name='"+obj.attr("name")+"']:checked").length;
return numselected >= need ? true : false;
},
'max2':function(gets,obj,curform,regxp){
var atmax=2,
numselected=curform.find("input[name='"+obj.attr("name")+"']:checked").length;
if(numselected==0){
return false;
}else if(numselected>atmax){
return "最多只能选择"+atmax+"项!";
}
return true;
},
'w': /^\w+$/,
'w6-20' :/^\w{6,20}$/,
'pi':/^[1-9]\d{0,2}$/, //只能输入正整数 3位
'lt365': /^([1-9]|([1-9]\d)|(1\d\d)|(3([0-4]\d|6[0-5])))$/,//小于365的正整数
'lt100':/^([1-9]\d?|100)$/,//小于100的正整数
'lt1000':/^([1-9]\d{0,2}|1000)$/,//小于1000的正整数
'lt10000':/^([1-9]\d{0,3}|10000)$/,//小于10000的正整数
'lt99':/^([1-9]\d{0,1}|99)$/,//小于999的正整数
'lt999':/^([1-9]\d{0,2}|999)$/,//小于999的正整数
'lt99999':/^([1-9]\d{0,4}|99999)$/,//小于99999的正整数
'lt999999':/^([1-9]\d{0,5}|999999)$/,//小于999999的正整数
'lint999999':/^([0-9]\d{0,5}|999999)$/,//小于999999的正整数
'lint99999':/^([0-9]\d{0,4}|99999)$/,//小于99999的正整数
'float99999':/^(?!0+(?:\.0+)?$)(?:[1-9]\d{0,4}|0)(?:\.\d{1,2})?$/,//保留两位小数
'float99900': /^([1-9][\d]{0,2}|0)(\.[\d]{1,2})?$/,//最大支持 999.99
'gt6':/^([6-9]|([1-9]\d)|([1-9]\d\d)|([1-9]\d\d\d))$/,//大于等于6的正整数
'money': /^([0-9][\d]{0,5})(\.[\d]{1,2})?$/,//最大支持 0~999999.99
'moneyNum': /^([0-9][\d]{0,5})(\.[\d]{1,2})|([0-9][\d]{0,5})$/,//最大支持 0~999999.99
'price1-99999900': /^(?!0+(?:\.0+)?$)(?:[1-9]\d{0,5}|0)(?:\.\d{1,2})?$/,//最大支持 0.01~999999.99
'price': /^(0?[0-9]\.[0,5]|[0-9]|[0-6][0-9]\.[0,5]|[0-6][0-9]|[7][0-1]\.[0,5]|[7][0-1]|[7][2]\.[0]|[7][2])$/,//正数浮点类型 例:1.0 或者1.5
'ch1-4':/^[\u4e00-\u9fa5]{1,4}$/,//纯中文 1-4
'ch1-5':/^[\u4e00-\u9fa5]{1,5}$/,//纯中文 1-5
'ch1-8':/^[\u4e00-\u9fa5]{1,8}$/,//纯中文 1-8
'ch1-10':/^[\u4e00-\u9fa5]{1,10}$/,//纯中文 1-10
'ch1-15':/^[\u4e00-\u9fa5]{1,15}$/,//纯中文 1-15
'ch1-20':/^[\u4e00-\u9fa5]{1,20}$/,//纯中文 1-20
'ch1-25':/^[\u4e00-\u9fa5]{1,25}$/,//纯中文 1-25
'ch1-30':/^[\u4e00-\u9fa5]{1,30}$/,//纯中文 1-30
'ch1-50':/^[\u4e00-\u9fa5]{1,50}$/,//纯中文 1-50
'ch1-150':/^[\u4e00-\u9fa5]{1,150}$/,//纯中文 1-150
'en':/^([a-zA-Z]+)$/,//纯英文
'en1-15':/^([a-zA-Z]{1,15})$/,//纯英文1-10
'en1-20':/^([a-zA-Z]{1,20})$/,//纯英文1-20
'en1-30':/^([a-zA-Z]{1,30})$/,//纯英文1-30
'en1-50':/^([a-zA-Z]{1,50})$/,//纯英文1-50
'ne2-10':/^([a-zA-Z0-9]{2,10})$/,//货号的限定
'ceh1-4':/^[\u4e00-\u9fa5a-zA-Z]{1,4}$/,//支持中文和英文 最大长度4
'ceh1-8':/^[\u4e00-\u9fa5a-zA-Z]{1,8}$/,//支持中文和英文 最大长度8
'ceh1-10':/^[\u4e00-\u9fa5a-zA-Z]{1,10}$/,//支持中文和英文 最大长度10
'ceh1-15':/^[\u4e00-\u9fa5a-zA-Z]{1,15}$/,//支持中文和英文 最大长度15
'ceh1-20':/^[\u4e00-\u9fa5a-zA-Z]{1,20}$/,//支持中文和英文 最大长度20
'ceh1-25':/^[\u4e00-\u9fa5a-zA-Z]{1,25}$/,//支持中文和英文 最大长度25
'ceh1-50':/^[\u4e00-\u9fa5a-zA-Z]{1,50}$/,//支持中文和英文 最大长度50
'cen1-10':/^[\u4e00-\u9fa5a-zA-Z0-9]{1,10}$/,//中文英文或者数字 1-10
'cen1-15':/^[\u4e00-\u9fa5a-zA-Z0-9]{1,15}$/,//中文英文或者数字 1-15
'cen1-20':/^[\u4e00-\u9fa5a-zA-Z0-9]{1,20}$/,//中文英文或者数字 1-20
'cen1-30':/^[\u4e00-\u9fa5a-zA-Z0-9]{1,30}$/,//中文英文或者数字 1-30
'cen1-50':/^[\u4e00-\u9fa5a-zA-Z0-9]{1,50}$/,//中文英文或者数字 1-50
'cenSpecial1-20':/^[\u4e00-\u9fa5a-zA-Z0-9!#@$%^&*;。,,;.]{1,20}$/,//中文英文或者数字 1-20
'special1-20':/^[\u4e00-\u9fa5a-zA-Z0-9()}{_+=!`~#@$%^&*;。,,;.]{1,20}$/,//中文英文或者数字 1-20
'sort':/^([1-9]\d{0,4}|99999)$/,//排序
'lpr':/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,//车牌号校验规则
'nes':/^(?![0-9]+$)(?![a-zA-Z]+$)(?![!#$%^&*]+$)[0-9a-zA-Z!#@$%^&*]$/,//必须字母开头,包含数字字母特殊符号
'nes6-20':/^(?![0-9]+$)(?![a-zA-Z]+$)(?![!#$%^&*]+$)[0-9a-zA-Z!#@$%^&*]{6,20}$/,//必须字母开头,包含数字字母特殊符号6-20
'nes1-20':/^(?![0-9]+$)(?![a-zA-Z]+$)(?![!#$%^&*]+$)[0-9a-zA-Z!#@$%^&*;.,]{1,20}$/,//必须字母开头,包含数字字母特殊符号6-20
'ne':/^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z][0-9a-zA-Z_]$/,// 包含数字字母_以字母开头
'ne4-15':/^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z][0-9a-zA-Z_]{4,15}$/,// 包含数字字母_4-15位以字母开头
'coe':/^([\u4e00-\u9fa5]+|([a-zA-Z]+\s?)+)$/,//纯中文或者纯英文
'coe1-10':/^([\u4e00-\u9fa5]{1,10}|([a-zA-Z]+\s?){1,10})$/,//纯中文或者纯英文 最大长度10
'houseNumber':/^\d{1,}-\d{1,}-\d{1,}$/,//房号校验
'parking':/^[0-9]{5}$/,//车位号 00001~99999
'goodId':/^[0-9a-z]{32}$/,//商品id
'loginName6-30':/^[0-9a-zA-Z_]{6,30}$/, // 登录名 支持英文数字和下划线,6~30
'url':/^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/,
'urlAll':/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/,
'url6-20':/^[0-9a-zA-Z\.!#@$%^&*:_{}\/]{6,20}$/,
'url1-255':/^[0-9a-zA-Z\.!#@$%^&*:_{}\/]{1,255}$/, // 支持数字字母特殊符号1-255
'code1-50':/^([a-zA-Z\-_]{1,50})$/,
'str1-20':/^\S{1,20}$/, // 1-20位字符串
'str1-30':/^\S{1,30}$/, // 1-30位字符串
'str1-200':/^\S{1,200}$/, // 1-200位字符串
'number_symbol_15':/^[0-9!#@$%^&*:_.,;'~()]{1,15}$/,
'moneySection': function (gets,obj,curform,regxp) {//金额区间
var float2=/^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/;
var minMoney = $(obj).attr('minMoney');//最小金额
var maxMoney = $(obj).attr('maxMoney');//最大金额
if(!float2.test(gets)){// 验证金额
return '请输入正整数或者两位小数';
}
if(minMoney && gets < parseFloat(minMoney)){
return '输入金额不能小于'+minMoney+'元';
}
if(maxMoney && gets > parseFloat(maxMoney)){
return '输入金额不能超过'+maxMoney+'元';
}
return true;
},
三、特殊需求js正则表达式
1 Email邮箱地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 另外一个: /^[A-Za-z0-9._%-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,4}$/
2 url域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 另外一个:/^1[3|4|5|7|8]\d{9}$/
5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} //懒人建站http://www.51xuediannao.com/
7 身份证号:
15或18位身份证:^\d{15}|\d{18}$
15位身份证:^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
18位身份证:^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
15 钱的输入格式:
16 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
17 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
18 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
19 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
20 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
21 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
22 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
24 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
26 中文字符的正则表达式:[\u4e00-\u9fa5]
27 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
28 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
29 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
32 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
33 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
34 不能为空:/\S/
35 匹配空行:^(\s*)\n
1 数字:^[0-9]*$
2 n位的数字:^\d{n}$
3 至少n位的数字:^\d{n,}$
4 m-n位的数字:^\d{m,n}$
5 零和非零开头的数字:^(0|[1-9][0-9]*)$
6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$