JS常见正则表达式写法(附案例)


正则表达式方法示例:

1. test方法解析,test判断正则是否在字符串中出现过,如果出现返回true,如果没出现返回false。
let str = 'hello world';
    let ret1 = /e/.test(str);   // true  
    let ret2 = /q/.test(str);   // false
    
    如:判断是否谷歌浏览器:   /Chrome/g.test(navigator.userAgent)   //返回true或false 

2. exec方法解析,exec跟match方法类似,也是返回匹配到的数组,如果没有匹配成功也是返回null。

let str = 'hello world';
    let arr1 = /e/.exec(str)   // ["e"]
    let arr2 = /q/.exec(str);   // null
区别在于exec方法在全局模式下,可以多次调用返回不同的值信息,如下:

let str = 'hello world';
    let re = /l/g;
    let arr1 = re.exec(str);   // ["l", index: 2, input: "hello world", groups: undefined]
    let arr2 = re.exec(str);   // ["l", index: 3, input: "hello world", groups: undefined]
    let arr3 = re.exec(str);   // ["l", index: 9, input: "hello world", groups: undefined]
    let arr4 = re.exec(str);   // null

当匹配不到结果的时候,才会返回null,所以在有g的情况下使用的时候要额外的小心,其实test方法也是具备这个特性的,例如:

let str = 'hello world';
    let re = /e/g;
    let ret1 = re.test(str);   // true
    let ret2 = re.test(str);   // false
    let ret3 = re.test(str);   // true
    let ret4 = re.test(str);   // false

模式修饰符
正则表达式为了改变模式的一些行为,提供了模式修饰符,常见的模式修饰符如下:

g修饰符
i修饰符
m修饰符
u修饰符
y修饰符
s修饰符
g修饰符
全局匹配,找到所有匹配,而不是第一个匹配成功后就结束。

let str = 'hello world';
let arr = str.match(/l/g);   // ["l", "l", "l"]
会找到整个字符串中所有出现过的l字符,g修饰符的目的就是从头匹配到尾,不管匹配过程中是成功还是失败。

 i 修饰符
忽略大小写,默认情况下是区分大小写的。

let str = 'hello world';
let ret1 = /E/.test(str);     // false
let ret2 = /E/i.test(str);    // true

 m 修饰符
可以执行多行匹配,作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个^和结尾$。

let str = 'hello\n world';
let ret1 = /hello$/.test(str);     // false
let ret2 = /hello$/m.test(str);    // true

 u 修饰符

意思是“Unicode模式”,用于正确处理大于\ uFFFF的 Unicode字符。这就是说,4字节的UTF-16编码将被正确地处理。

let str = '\uD83D\uDC2A';
let ret1 = /^\uD83D/.test(str);     // true
let ret2 = /^\uD83D/u.test(str);    // false
在上述代码中,\uD83D\uDC2A是4字节的UTF-16编码,它代表一个字符。然而,ES5并不支持4字节的UTF-16编码,当它被识别为两个字符时,结果为 true。在加入 u修饰符之后,ES6将识别出它是字符,因此第一行代码的结果是 false。添加了一个u修饰符号之后,下面这些正则表达式的行为被修改。
 

 y 修饰符

类似于g修饰符,也是全局匹配,后者将从上次匹配成功的下一个位置开始。区别在于, g修饰符只要在余下的位置上存在匹配,而 y修饰符则确保匹配必须从剩下的第一个位置开始,这就是粘连的含义。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]
r2.exec(s) // null
上述代码包含两个正则表达式,一个使用 g修饰符,另一个使用 y修饰符。那两个正则表达式分别执行两次,第一次执行时,它们表现相同,剩下的字符串都是_aa_a。因为 g修饰不需要位置,因此第二次执行返回结果,而 y修饰符要求匹配必须从头部开始,因此返回 null。
 

 s 修饰符
dotAll模式,匹配任何字符(包括终止符\n)。这个的目的是解决不能匹配终止符的问题。

/foo.bar/s.test('foo\nbar') // true

正则基础语法
正则除了相关方法和修饰符外,还有很多跟正则相关的语法,先来看看基础语法的使用。

转义字符
转义字符在正则中主要有两种用法:

        1. 表示正则中的一些特殊含义的功能。

        2. 表示跟正则语法冲突的字符形式。

在第一种用法中,常见的特殊含义功能有:

\d 匹配数字
\D 匹配非数字
\s 匹配空格
\S 匹配非空格
\w 匹配字符
\W 匹配非字符
\b 匹配端点
\B 匹配非端点


数字、空格都比较简单,下面来说说字符,在正则中字符表示的是字母、下划线、数字这三部分,除了这三部分以外的字符表示非字符;在正则中端点表示的是起始、结束、空格这三部分,除了这三部分以外的字符表示非端点。
 

let str = 'hello world';
let ret1 = /\w/.test(str);  // true
let ret2 = /\bhello\b/.test(str);  // true

在第二种用法中,常见的语法转义功能有:

        + 匹配+字符
        * 匹配*字符
        \? 匹配?字符
        \/ 匹配/字符
        . 匹配.字符
        ( 匹配(字符
        [ 匹配[字符
        { 匹配{字符
        \| 匹配|字符

这些字符在正则中本身就是语法,所以不能进行对应的字符匹配,需要进行转义后方可匹配成功。

let str = 'hello?world';
let ret1 = /hello?world/.test(str);   // false
let ret2 = /hello\?world/.test(str);  // true

量词
 主要目的是匹配不确定的字符位数,常见的语法有:

        - * 匹配至少0位

        - + 匹配至少1位

        - ? 匹配至少0位到1位

let str = 'ab';
let ret = /ab+/.test(str);   // 匹配 ab  abb abbb ...
上面这些量词符号,其实是{}语法的一种简写形式,即:*对应{0,},+对应{1,},?对应{0,1}。{}是专门进行量词匹配的。

        let str = '1234';
        let ret = /\d{4}/.test(str);   // 匹配四位数字

字符范围
有时候需要对字符进行或的操作,在正则中专门提供了 | 作为或操作方式。

        let str = 'abc';
        let ret = /a(b|d|e)c/.test(str);   // 匹配:abc、adc、aec 这几个词

除了可以用 | 操作符以外,还可以选择 [] 方式。

        let str = 'abc';
        let ret = /a[bde]c/.test(str);   // 匹配:abc、adc、aec 这几个词
         [ ] 中的每一个字符都是或的关系,如果要表示返回比较大的操作,还可以采用-语法。
 

        let str = 'abc';
        let ret = /a[a-z]c/.test(str);   // a-z匹配26个字母  0-9匹配所有数字等
        [] 中还可以进行排除操作,通过^语法实现。
 

        let str = 'abc';
        let ret = /a[^bde]c/.test(str);   // 匹配除了:abc、adc、aec 这几个词以外的词


起始与结束
有时候需要匹配整体字符串,而不是只匹配字符串的部分,这种情况下就要用到起始和结束了,例如只匹配两位数的正则写法。

        let str = 'a19b';
        let ret = /^\d{2}$/.test(str);   // false 需要整体匹配成功才可
        let ret = /\d{2}/.test(str);     // true 部分匹配成功即可

其中^表示起始位置必须是数字,$表示结束位置必须是数字,这样就可以保证正则去字符串中匹配整体。
 

正则高级语法
除了最基本的正则语法外,还有一些更加高级的使用方式,下面一起看一下。

子项与重复的子项
在正则中可以通过()来进行分组,除了分组外,()还有一个很重要的作用就是子项了。子项的含义是匹配到正则匹配到的部分的局部字符。

        let str = 'hello world';
        let ret = str.match(/h(e)llo/);  // ["hello", "e", index: 0, input: "hello world", groups: undefined]
可以看到"hello"是匹配到的整体,而"e"就是匹配到的子项,而且正则中子项添加也是可以存在多个的,例如:

        let str = 'hello world';
        let ret = str.match(/h(e)(ll)(o)/);  
        // ["hello", "e", "ll", "o", index: 0, input: "hello world", groups:undefined]

以上结果中会返回三个子项,分别为:"e"、"ll"、"o";如果想要忽略掉子项,只是保留分组功能的话,可以采用 ?: 这个语法。
 

        let str = 'hello world';
        let ret = str.match(/h(e)(?:ll)(o)/);  // ["hello", "e", "o", index: 0, input: "hello world", groups:undefined]

这样就是只要两个子项了,分别为:"e"、"o"。具备子项功能的方法还有:exec、matchAll、replace,这里就不一一演示了。
 

具名组匹配
可以发现子项的排列是根据顺序来决定的,除了顺序外,还可以通过具名的方式进行匹配。允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。

        let RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
        let matchObj = RE_DATE.exec('1999-12-31');
        let year = matchObj.groups.year; // "1999"
        let month = matchObj.groups.month; // "12"
        let day = matchObj.groups.day; // "31"


上例中,“具名组匹配”位于括号内,“问号+尖括号+组名”(?< year>),然后可以在exec方法返回结果的 groups属性中引用它。与此同时,数字序号(matchObj [1])仍然有效。

具名组匹配等于在每一组匹配中添加ID,便于描述匹配的目的。当更改组顺序时,也不必更改匹配后的处理代码。若该具名组不匹配,则对应的groups对象属性为未定义。

贪婪模式与非贪婪模式
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。非贪婪匹配:就是匹配到结果就好,就少的匹配字符。

let str = '<div>aaaaaaaaa</div>bbbbbbbbbbb<div>ccccccccccc</div>';

//贪婪模式
let re = /<([a-z0-9]+)>.+<\/\1>/;  
str.match(re); //['<div>aaaaaaaaa</div>bbbbbbbbbbb<div>ccccccccccc</div>']

let str = '<div>aaaaaaaaa</div>bbbbbbbbbbb<div>ccccccccccc</div>';

//非贪婪模式
let re = /<([a-z0-9]+)>.+?<\/\1>/;  
str.match(re); // ['<div>aaaaaaaaa</div>']
可以看到两段代码的对比,贪婪是把可以匹配的最大长度得到,而非贪婪是最少匹配字符,可通过?的方式实现非贪婪模式。

前瞻与后顾
前瞻与后顾,只把它作为条件,但是不会把它匹配到结果中。相关的语法:

(?=exp) 正向前瞻 例如:100(?=px) -> 100px 匹配成功 -> 结果:100
(?!exp) 负向前瞻 例如:100(?!px) -> 100rem、100% 匹配成功 -> 结果:100
(?<=exp) 正向后顾 例如:(?<=\$)123 -> $123 匹配成功 -> 结果:123
(?<!exp) 负向后顾 例如:(?<!\$)123 -> ¥123 a123 匹配成功 -> 结果:123


附录:常见正则表达式写法(案例):
---------------------------------------------------------------------------------------------------------------------

        火车车次: /^[GCDZTSPKXLY1-9]\d{1,4}$/

        手机机身码(IMEI):  /^\d{15,17}$/

        必须带端口号的网址(或ip) :  /^((ht|f)tps?:\/\/)?[\w-]+(.[\w-]+)+:\d{1,5}\/?$/

        网址(url,支持端口和"?+参数"和"#+参数):  /^(((ht|f)tps?):\/\/)?[\w-]+(.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/

        统一社会信用代码: /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/

        统一社会信用代码(宽松匹配)(15位/18位/20位数字/字母):  /^(([0-9A-Za-z]{15})|([0-9A-Za-z]{18})|([0-9A-Za-z]{20}))$/

        迅雷链接: /^thunderx?:\/\/[a-zA-Z\d]+=$/

        ed2k链接(宽松匹配):  /^ed2k:\/\/\|file\|.+\|\/$/

        磁力链接(宽松匹配):  /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/

        子网掩码:  /^(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/

        linux"隐藏文件"路径:  /^\/(?:[^/]+\/).[^/]/

        linux文件夹路径: /^\/(?:[^/]+\/)*$/

        linux文件路径:  /^\/(?:[^/]+\/)*[^/]+$/

        window"文件夹"路径:  /^[a-zA-Z]:\(?:\w+\?)*$/

        window下"文件"路径:  /^[a-zA-Z]:\(?:\w+\)*\w+.\w+$/

        股票代码(A股):  /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/

        大于等于0, 小于等于150, 支持小数位出现5, 如145.5, 用于判断考卷分数:   /^150$|^(?:\d|[1-9]\d|1[0-4]\d)(?:.5)?$/

        html注释:  /^$/

        md5格式(32位): /^([a-f\d]{32}|[A-F\d]{32})$/

        GUID/UUID:  /^[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}$/i

        版本号(version)格式必须为X.Y.Z:  /^\d+(?:.\d+){2}$/

        视频(video)链接地址(视频格式可按需增删):  /^https?:\/\/(.+\/)+.+(.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i

        图片(image)链接地址(图片格式可按需增删):  /^https?:\/\/(.+\/)+.+(.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i

        24小时制时间(HH:mm:ss):  /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/

        12小时制时间(hh:mm:ss):  /^(?:1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/

        base64格式:  /^\sdata:(?:[a-z]+\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()+;=-._~:@/?%\s]?)\s$/i

        数字/货币金额(支持负数、千分位分隔符):  /^-?\d+(,\d{3})*(.\d{1,2})?$/

        数字/货币金额 (只支持正数、不支持校验千分位分隔符):  /(?:^1-9?(?:.[0-9]{1,2})?$)|(?:^(?:0)$)|(?:^[0-9].0-9?$)/

        银行卡号(10到30位, 覆盖对公/私账户, 参考微信支付):  /^[1-9]\d{9,29}$/

        中文姓名:  /^(?:[\u4e00-\u9fa5·]{2,16})$/

        英文姓名:  /(^[a-zA-Z][a-zA-Z\s]{0,20}[a-zA-Z]$)/

        车牌号(新能源):  /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]A-HJ-NP-Z|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])$/

        车牌号(非新能源):  /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$/

        车牌号(新能源+非新能源):  /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/

        手机号(mobile phone)中国(严谨), 根据工信部2019年最新公布的手机号段:  /^(?:(?:+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/

        手机号(mobile phone)中国(宽松), 只要是13,14,15,16,17,18,19开头即可:  /^(?:(?:+|00)86)?1[3-9]\d{9}$/

        手机号(mobile phone)中国(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条:  /^(?:(?:+|00)86)?1\d{10}$/

        date(日期):  /^\d{1,4}(-)(1[0-2]|0?[1-9])\1(0?[1-9]|[1-2]\d|30|31)$/

        email(邮箱):  /^(([^<>()[]\.,;:\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,}))$/

        座机(tel phone)电话(国内),如: 0341-86091234:  /^(?:(?:\d{3}-)?\d{8}|^(?:\d{4}-)?\d{7,8})(?:-\d+)?$/

        身份证号(1代,15位数字):  /^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$/

        身份证号(2代,18位数字),最后一位是校验位,可能为数字或字符X:  /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/

        身份证号, 支持1/2代(15位/18位数字):  /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/

        护照(包含香港、澳门): /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/

        帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合:  /^[a-zA-Z]\w{4,15}$/

        中文/汉字:  /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/

        小数: /^\d+.\d+$/

        数字: /^\d{1,}$/

        html标签(宽松匹配): /<(\w+)[^>]>(.?<\/\1>)?/

        qq号格式正确:  /^[1-9][0-9]{4,10}$/

        数字和字母组成:  /^[A-Za-z0-9]+$/

        英文字母:  /^[a-zA-Z]+$/

        小写英文字母组成:  /^[a-z]+$/

        大写英文字母:  /^[A-Z]+$/

        密码强度校验,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符:  /^\S(?=\S{6,})(?=\S\d)(?=\S[A-Z])(?=\S[a-z])(?=\S[!@#$%^&? ])\S*$/

        用户名校验,4到16位(字母,数字,下划线,减号):  /^[a-zA-Z0-9_-]{4,16}$/

        ip-v4[:端口]:  /^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]).){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/

        ip-v6[:端口]:  /^(?:(?:(?:[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}:))|[(?:(?:(?:[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}:))](?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/i

        16进制颜色:  /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/

        微信号(wx),6至20位,以字母开头,字母,数字,减号,下划线:  /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/

        邮政编码(中国) : /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/

        中文和数字:  /^((?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])|(\d))+$/

        不能包含字母: /^[^A-Za-z]*$/

        java包名:  /^([a-zA-Z_]\w)+([.][a-zA-Z_]\w)+$/

        mac地址:  /^((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}$/i

        匹配连续重复的字符:  /(.)\1+/

        数字和英文字母组成,并且同时含有数字和英文字母:  /^(?=.[a-zA-Z])(?=.\d).+$/

        香港身份证:  /^[a-zA-Z]\d{6}([\dA])$/

        澳门身份证:  /^[1|5|7]\d{6}[(\d)]{3}$/

        台湾身份证:  /^[a-zA-Z][0-9]{9}$/


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch的讲解及实战·MNIST数据集手写数字识别

目录 一、前言与pytorch的下载 1、前言 2、下载pytorch ①创建虚拟环境 ②下载pytorch&#xff08;cpu版&#xff09; ③测试pytorch是否下载成功 ④使用jupyter notebook 但是使用不了torch的解决方法 二、pytorch的使用 1、Tensor的数据类型 ①torch.FloatTensor …

【nw.js】使用nw.js将html页面打包成exe免安装程序

文章目录 一、批处理zip命令&#xff08;已有可跳过此步骤&#xff09;二、nw.js包三、使用批处理命令打包成exe可执行文件四、使用EnigmaVB打包成免安装可独立运行的exe文件五、结束 一、批处理zip命令&#xff08;已有可跳过此步骤&#xff09; 下载zip&#xff0c;你可以到该…

maven依赖无法传递问题排查

一、背景 在A模块中引入B模块&#xff0c;C服务引入A模块但是B模块没有传递进来。 二、排查 使用mvn clean install -Dmaven.test.skiptrue查看打包日志信息&#xff0c;通过搜索A模块名称&#xff0c;出现如下警告信息&#xff1a; [WARING] The POM for A:jar:0.0.1-SNAP…

HarmonyView: Harmonizing Consistency and Diversity in One-Image-to-3D

Q: 这篇论文试图解决什么问题&#xff1f; A: 这篇论文试图解决单张图像到3D内容生成中的一致性和多样性之间的平衡问题。具体来说&#xff0c;论文提出了一个名为HarmonyView的方法&#xff0c;它通过分解一致性和多样性这两个方面来生成既具有视觉一致性又具有多样性的3D内容…

ROS无人机初始化GPS定位漂移误差,确保无人机稳定飞行

引言&#xff1a; 由于GPS在室外漂移的误差比较大&#xff0c;在长时间静止后启动&#xff0c;程序发布的位置可能已经和预期的位置相差较大&#xff0c;导致无法完成任务&#xff0c;尤其是气压计的数据不准&#xff0c;可能会导致无人机不能起飞或者一飞冲天。本文主要是在进…

53.网游逆向分析与插件开发-游戏反调试功能的实现-通过内核信息检测调试器

码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;b44fddef016fc1587eda40ca7f112f02a8289504 代码下载地址&#xff0c;在 SRO_EX 目录下&#xff0c;文件名为&#xff1a;SRO_Ex-通过内核信息…

ceph集群搭建到应用从入门到熟练,包含块存储、对象存储、cephfs的应用、cephx认证等

ceph-deploy比较适合生产环境&#xff0c;不是用cephadm搭建。相对麻烦一些&#xff0c;但是并不难&#xff0c;细节把握好就行&#xff0c;只是命令多一些而已。 ceph理论知识 略… ceph集群实验环境 服务器主机public网段IP&#xff08;对外服务&#xff09;cluster网段I…

取出一个时间序列中每一个元素里的日期Series.dt.date()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 取出一个时间序列中 每一个元素里的年月日 Series.dt.date [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd t pd.Series(pd.date_range("2023-12-28", periods4…

OpenCV中使用Mask R-CNN实现图像分割的原理与技术实现方案

本文详细介绍了在OpenCV中利用Mask R-CNN实现图像分割的原理和技术实现方案。Mask R-CNN是一种先进的深度学习模型&#xff0c;通过结合区域提议网络&#xff08;Region Proposal Network&#xff09;和全卷积网络&#xff08;Fully Convolutional Network&#xff09;&#xf…

Java企业电子招投标系统源代码,支持二次开发,采用Spring cloud框架

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

饥荒Mod 开发(二四):制作一把万能工具

饥荒Mod 开发(二三)&#xff1a;显示物品栏详细信息 饥荒Mod 开发(二五)&#xff1a;常用组件 总结 源码 饥荒中的每种工具都有独特的功能&#xff0c;比如 斧头用来砍树&#xff0c; 铲子用来 挖东西&#xff0c;鹤嘴锄用来挖矿&#xff0c; 锤子可以敲碎东西&#xff0c;所以…

2013年第二届数学建模国际赛小美赛A题数学与经济灾难解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 A题 数学与经济灾难 原题再现&#xff1a; 2008年的市场崩盘使世界陷入经济衰退&#xff0c;目前世界经济仍处于低迷状态&#xff0c;其原因是多方面的。其中之一是数学。   当然&#xff0c;并非只有金融界依赖于并非总是可靠的数学模型…

编程艺术C代码学习注释

一、左旋转字符串 详情见文章参考&#xff1a; github:程序员编程艺术csdn:程序员编程艺术第一章 1.暴力移位 void leftShift1(char * arr, int n) //n位移动的位数 {size_t tmpLen strlen(arr);char tmpChar;int i, j;if (n > 0){for (i 0; i < n; i){tmpChar …

postman使用-03发送请求

文章目录 请求1.新建请求2.选择请求方式3.填写请求URL4.填写请求参数get请求参数在params中填写&#xff08;填完后在url中会自动显示&#xff09;post请求参数在body中填写&#xff0c;根据接口文档请求头里面的content-type选择body中的数据类型post请求参数为json-选择raw-选…

Flask 与微信小程序对接

Flask 与微信小程序的对接 在 web/controllers/api中增建py文件&#xff0c;主要是给微信小程序使用的。 web/controllers/init.py # -*- coding: utf-8 -*- from flask import Blueprint route_api Blueprint( api_page,__name__ )route_api.route("/") def ind…

软件测试/测试开发丨Pytest测试用例生命周期管理-Fixture

1、Fixture 用法 Fixture 特点及优势 1&#xff64;命令灵活&#xff1a;对于 setup,teardown,可以不起这两个名字2&#xff64;数据共享&#xff1a;在 conftest.py 配置⾥写⽅法可以实现数据共享&#xff0c;不需要 import 导⼊。可以跨⽂件共享3&#xff64;scope 的层次及…

Linux内核中断

Linux内核中断 ARM里当按下按键的时候&#xff0c;他首先会执行汇编文件start.s里面的异常向量表里面的irq,在irq里面进行一些操作。 再跳转到C的do_irq(); 进行操作&#xff1a;1&#xff09;判断中断的序号&#xff1b;2&#xff09;处理中断&#xff1b;3&#xff09;清除中…

2024美赛数学建模思路A题B题C题D题E题F题思路汇总 选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

模型部署之——ONNX模型转RKNN

提示&#xff1a;这里可以添加学习目标 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、加载Docker镜像二、转换脚本 一、加载Docker镜像 加载rknn官方提供的基于x86架构下模型转换的镜像文件&#xff0c;生成…

【JavaScript】new原理解析

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…