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

  1. 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 = /abdec/.test(str); // 匹配:abc、adc、aec 这几个词

中的每一个字符都是或的关系,如果要表示返回比较大的操作,还可以采用-语法。

let str = 'abc';

let ret = /aa-zc/.test(str); // a-z匹配26个字母 0-9匹配所有数字等

\[\] 中还可以进行排除操作,通过^语法实现。

let str = 'abc';

let ret = /a\^bdec/.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); //'\aaaaaaaaa\bbbbbbbbbbb\ccccccccccc\'

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

//非贪婪模式

let re = /<(a-z0-9+)>.+?<\/\1>/;

str.match(re); // '\aaaaaaaaa\'

可以看到两段代码的对比,贪婪是把可以匹配的最大长度得到,而非贪婪是最少匹配字符,可通过?的方式实现非贪婪模式。

前瞻与后顾

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

(?=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|20-4\d|250-5)(?:.(?:\d{1,2}|1\d\d|20-4\d|250-5)){3}$/

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

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

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

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

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

股票代码(A股): /^(shz|SHZ)(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|20-3):0-5\d:0-5\d$/

12小时制时间(hh:mm:ss): /^(?:10-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-Za-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-ZA-HJ-NP-Z0-9{4}A-HJ-NP-Z0-9挂学警港澳$/

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

手机号(mobile phone)中国(严谨), 根据工信部2019年最新公布的手机号段: /^(?:(?:+|00)86)?1(?:(?:3\\d)|(?:45-79)|(?:50-35-9)|(?:65-7)|(?:70-8)|(?:8\\d)|(?:9189))\d{8}$/

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

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

date(日期): /^\d{1,4}(-)(10-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)(?:01-9|1-2\\d|30|31)\d{3}$/

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

身份证号, 支持1/2代(15位/18位数字): /^\d{6}((((((19|20)\d{2})(013-9|1012)(01-9|12\d|30))|(((19|20)\d{2})(013578|102)31)|((19|20)\d{2})02(01-9|1\d|20-8)|((((19|20)(1357926|2468048|048))|(2000))0229))\d{3})|((((\d{2})(013-9|1012)(01-9|12\d|30))|((\d{2})(013578|102)31)|((\d{2})02(01-9|1\d|20-8))|((1357926|2468048|0048)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-90-9{4,10}$/

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

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

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

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

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

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

ip-v4:端口: /^((\d|1-9\d|1\d\d|20-4\d|250-5).){3}(\d|1-9\d|1\d\d|20-4\d|250-5)(?::(?:0-9|1-90-9{1,3}|1-50-9{4}|60-40-9{3}|650-40-9{2}|6550-20-9|65530-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((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b))|((0-9A-Fa-f{1,4}:){0,5}:((\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b))|(::(0-9A-Fa-f{1,4}:){0,5}((\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-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((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b))|((0-9A-Fa-f{1,4}:){0,5}:((\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b))|(::(0-9A-Fa-f{1,4}:){0,5}((\b((250-5)|(1\d{2})|(20-4\d)|(\d{1,2}))\b).){3}(\b((250-5)|(1\d{2})|(20-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-90-9{1,3}|1-50-9{4}|60-40-9{3}|650-40-9{2}|6550-20-9|65530-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}$/

邮政编码(中国) : /^(01-7|10-356|20-7|30-6|40-7|51-7|61-7|70-5|8013-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-Z0-9{9}$/

相关推荐
二月夜5 小时前
剖析Java正则表达式回溯问题
java·正则表达式
想吃火锅10056 小时前
【leetcode】405.数字转换为十六进制数js
开发语言·javascript·ecmascript
原则猫8 小时前
HOOKS 背后机制
前端
码语智行8 小时前
首页导航跳转功能深度解析-系统内和系统外
前端
阿猫的故乡9 小时前
Vue过渡动画从入门到装X:淡入淡出、滑动、列表动画、第三方库全搞定
前端·javascript·vue.js
IManiy9 小时前
总结之Vibe Coding前端骨架
前端
小和尚敲木头9 小时前
vue3 vite动态拼接图片路径
javascript
JS菌9 小时前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
Aphasia3119 小时前
从输入URL到页面展示全流程
前端·面试
我叫黑大帅10 小时前
前端如何竖屏固定视口背景
前端·javascript·面试