# 1.什么是正则 + 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 字符串的正则方法 # 2.为什么要使用正则 通过正则可以做到: + 测试字符串内的模式。 例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 + 替换文本。 可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 + 基于模式匹配从字符串中提取子字符串。 可以查找文档内或输入域内特定的文本。 # 3.应用领域 + C+ + Java + *__Javascript__* + Python + Ruby (*Ruby*是一种跨平台、面向对象的动态类型编程语言。) # 4.正则表达式 正则表达式由一些普通[字符](https://baike.baidu.com/item/%E5%AD%97%E7%AC%A6)和一些[元字符](https://baike.baidu.com/item/%E5%85%83%E5%AD%97%E7%AC%A6)(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。 ``` //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uPattern.test("caibaojian")); ``` ## 4-1.正则语法 + 构造函数 ``` const reg = new RegExp('e','g'); ``` + 字面量 ``` const reg = /e/g ``` + 其他(MDN)元字符需要双转译 ``` const regNew= new RegExp(/\[ca\]at/g) ``` ### **4-1-1关于声明式正则的双转译** 匹配 字符串 [cb]at const bb = /\[cb\]at/g // 匹配 字符串 [cb]at const cc = new RegExp('\\[cb\\]at', 'g') // 需要双转译 ``` const egStr1 = '[bat]asbattrophe'; const egStr2 = '[bat]asb[cb]attrophe'; const aa = new RegExp('[cb]at', 'g'); // 匹配的不是字符串'[cb]at' 等价于 /[cb]at/ const bb = /\[cb\]at/g; // 匹配 字符串 [cb]at const cc = new RegExp('\\[cb\\]at', 'g'); // 需要双转译 // const dd = new RegExp('\[cb\]at', 'g'); dd==aa const ee = new RegExp(/\[cb\]at/g); const str_aa1 = aa.test(egStr1); // true const str_aa2 = aa.test(egStr2); // false const str2 = bb.test(egStr1); // false // str2 = bb.test(egStr2) // true const str3 = cc.test(egStr1); // false const str_dd1 = dd.test(egStr1); const str_dd2 = dd.test(egStr2); const str_ee1 = ee.test(egStr1); // false const str_ee2 = ee.test(egStr2); // false console.error(str_dd1, 'str_dd1', str_dd2, 'str_dd2'); console.log( str_aa1, 'str1-=-=-', str_aa2, 'str4-=-', str2, 'str2cc>>-=-=-=-=-', str3, '’str3-=-=-=', str_ee1, 'str_ee1-=-=-=', str_ee2, 'str_ee2-=-=-=', ); ``` **字面量模式与等价的字符串** | 字面量模式 | 等价的字符串 | | ---------------- | --------------------------- | | /\[bc\]at/ | "\\[bc\\]at" | | /\.at/ | "\\.at" | | /name\/age/ | "name\\/age" | | /\d.\d{1,2}/ | "\\d.\\d{1,2}" 单 | | /\w\\hello\\123/ | "\\w\\\\hello\\\\123" 单+双 | ## 4-2.特殊符号的含义 **修饰符 : g 、 i 、 m 、u、y、s(提案中,IE、安卓版火狐不支持MDN)** + g: global,全文搜索,默认搜索到第一个结果接停止 + i: ingore case,忽略大小写,默认大小写敏感 + m: multiple lines,多行搜索(更改^ 和$的含义,使它们分别在任意一行对待行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配) ``` let str2 = '1.第一章\n2.第二章\n3.第三章' //4、换行符 let reg3 = /^\d/gm //2、m多行匹配 alert(str2.replace(reg3, '#')) ``` + u: Unicode模式,用于处理大于\uFFFF的Unicode字符 + [Unicdoe【真正的完整码表】对照表](https://blog.csdn.net/hherima/article/details/9045861?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase) + [Unicode中文编码表](https://blog.csdn.net/qlwangcong518/java/article/details/85016294) ``` // Match any symbol from U+1F4A9 PILE OF POO to U+1F4AB DIZZY SYMBOL. const regex = /[💩-💫]/u; // Or, `/[\u{1F4A9}-\u{1F4AB}]/u`. console.log( regex.test('💨'), // false regex.test('💩'), // true regex.test('💪'), // true regex.test('💫'), // true regex.test('💬') // false ); const s = '吉' // \u5409 const aa = /^.$/.test(s) // .除换行符号意外的任意单个字符 const bb = /^.$/u.test(s) console.log('aa>>>', aa, 'bb>>>', bb) ``` + y: "粘连(sticky)"修饰符 ``` let s = 'aaa_aa_a' let r1 = /a+/g let r2 = /a+/y let aa = r1.exec(s) // ['aaa'] console.error('r1第一次aa', aa) aa = r1.exec(s) // ['aa'] console.error('aa', aa, 'r1第二次') aa = r1.exec(s) console.error('第三次aa', aa) aa = r1.exec(s) console.error('第四次aa', aa) aa = r1.exec(s) console.error('第五次aa', aa) console.log('-------------------') let bb = r2.exec(s) // ['aaa'] console.error('r2第一次', bb) bb = r2.exec(s) // null console.error('r2第二次bb', bb) bb = r2.exec(s) // ['aaa'] console.error('r2第三次bb', bb) bb = r2.exec(s) // null console.error('r2第四次bb', bb) bb = r2.exec(s) // ['aaa'] console.error('r2第五次bb', bb) ``` + s: 如果使用了"s"修饰符,dotAll 的值将返回Boolean类型的true,否则将返回false。"s"修饰符表示,特殊字符"."应另外匹配字符串中的下述行终结符(line terminator characters),否则将会失配: U+000A 换行符**("\n")** U+000D 回车符**("\r"**) U+2028 行分隔符**(line separator)** U+2029 段分隔符**(paragraph separator)** 这实际上意味着"."将会匹配任意的单个Unicode Basic Multilingual Plane (BMP)字符。若要使其与astral字符(大于\uFFFF的Unicode字符)匹配,你应当使用"u"(Unicode)修饰符。一起使用这两个修饰符,"."将无一例外地匹配任意Unicode字符 ``` const str = 'foo\nbar' const reg1 = /foo.bar/.test(str) // false const reg2 = /foo[^]bar/.test(str) // true const reg = /foo.bar/s.test(str) // true console.log(reg1, reg2, reg) ``` # 5.匹配规则 ## 5-1.特殊字符含义 + 方括号: [] ``` 方括号用于查找某个范围内的字符:(可以构建一个简单的类,所谓类是指,符合某些特征的对象,是一个泛指,而不是特指某个字符了) ``` | 表达式 | 描述 | | ------------------------------------------------------------ | -------------------------- | | [[abc\]](http://www.w3school.com.cn/jsref/jsref_regexp_charset.asp) | 查找方括号之间的任何字符。 | + 特殊字符的含义: \ ``` \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 let pattern = /s$/; 它所匹配的是字符串的结尾.所以正则表达式 /s$/ 匹配的就是以字母 "s" 结尾的字符串. ``` | 特殊字符 | 描述 | | -------- | ------------------------------------------------------------ | | ^ | 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" | | $ | 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" | | * | 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa | | + | 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa | | ? | 匹配前面元字符0次或1次,/ba*/将匹配b,ba | | (x) | 匹配x保存x在名为$1...$9的变量中 | | x\|y | 匹配x或y | | {n} | 精确匹配n次 | | {n,} | 匹配n次以上 | | {n,m} | 匹配n-m次 | | [xyz] | 字符集(character set),匹配这个集合中的任一一个字符(或元字符) | | [^xyz] | 不匹配这个集合中的任何一个字符 | | [\b] | 匹配一个退格符 | | \b | 匹配一个单词的边界 | | \B | 匹配一个单词的非边界 | | \cX | 这儿,X是一个控制符,/\cM/匹配Ctrl-M | | \d | 匹配一个字数字符,/\d/ = /[0-9]/ | | \D | 匹配一个非字数字符,/\D/ = /[^0-9]/ | | \n | 匹配一个换行符 | | \r | 匹配一个回车符 | | \s | 匹配一个空白字符,包括\n,\r,\f,\t,\v等 | | \S | 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ | | \t | 匹配一个制表符 | | \v | 匹配一个重直制表符 | | \w | 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。 | --------------------- + 元字符 元字符(Metacharacter)是拥有特殊含义的字符: | 元字符 | 描述 | | ------------------------------------------------------------ | ------------------------------------------- | | [.](http://www.w3school.com.cn/jsref/jsref_regexp_dot.asp) | 查找单个字符,除了换行和行结束符。 | | [\w](http://www.w3school.com.cn/jsref/jsref_regexp_wordchar.asp) | 查找单词字符。 | | [\W](http://www.w3school.com.cn/jsref/jsref_regexp_wordchar_non.asp) | 查找非单词字符。 | | [\d](http://www.w3school.com.cn/jsref/jsref_regexp_digit.asp) | 查找数字。 | | [\D](http://www.w3school.com.cn/jsref/jsref_regexp_digit_non.asp) | 查找非数字字符。 | | [\s](http://www.w3school.com.cn/jsref/jsref_regexp_whitespace.asp) | 查找空白字符。 | | [\S](http://www.w3school.com.cn/jsref/jsref_regexp_whitespace_non.asp) | 查找非空白字符。 | | [\b](http://www.w3school.com.cn/jsref/jsref_regexp_begin.asp) | 匹配单词边界。 | | [\B](http://www.w3school.com.cn/jsref/jsref_regexp_begin_not.asp) | 匹配非单词边界。 | | \0 | 查找 NUL 字符。 | | [\n](http://www.w3school.com.cn/jsref/jsref_regexp_newline.asp) | 查找换行符。 | | \f | 查找换页符。 | | \r | 查找回车符。 | | \t | 查找制表符。 | | \v | 查找垂直制表符。 | | [\xxx](http://www.w3school.com.cn/jsref/jsref_regexp_octal.asp) | 查找以八进制数 xxx 规定的字符。 | | [\xdd](http://www.w3school.com.cn/jsref/jsref_regexp_hex.asp) | 查找以十六进制数 dd 规定的字符。 | | [\uxxxx](http://www.w3school.com.cn/jsref/jsref_regexp_unicode_hex.asp) | 查找以十六进制数 xxxx 规定的 Unicode 字符。 | + 量词 | 量词 | 描述 | | ------------------------------------------------------------ | ------------------------------------------- | | [n+](http://www.w3school.com.cn/jsref/jsref_regexp_onemore.asp) | 匹配任何包含至少一个 n 的字符串。 | | [n*](http://www.w3school.com.cn/jsref/jsref_regexp_zeromore.asp) | 匹配任何包含零个或多个 n 的字符串。 | | [n?](http://www.w3school.com.cn/jsref/jsref_regexp_zeroone.asp) | 匹配任何包含零个或一个 n 的字符串。 | | [n{X}](http://www.w3school.com.cn/jsref/jsref_regexp_nx.asp) | 匹配包含 X 个 n 的序列的字符串。 | | [n{X,Y}](http://www.w3school.com.cn/jsref/jsref_regexp_nxy.asp) | 匹配包含 X 至 Y 个 n 的序列的字符串。 | | [n{X,}](http://www.w3school.com.cn/jsref/jsref_regexp_nxcomma.asp) | 匹配包含至少 X 个 n 的序列的字符串。 | | [n$](http://www.w3school.com.cn/jsref/jsref_regexp_ndollar.asp) | 匹配任何结尾为 n 的字符串。 | | [^n](http://www.w3school.com.cn/jsref/jsref_regexp_ncaret.asp) | 匹配任何开头为 n 的字符串。 | | [?=n](http://www.w3school.com.cn/jsref/jsref_regexp_nfollow.asp) | 匹配任何其后紧接指定字符串 n 的字符串。 | | [?!n](http://www.w3school.com.cn/jsref/jsref_regexp_nfollow_not.asp) | 匹配任何其后没有紧接指定字符串 n 的字符串。 | ## 5-2.字符自身匹配 ``` 字母数字字符 自身 \ f 换页符 \ n 换行符 \ r 回车 \ t 制表符 \ v 垂直制表符 \ / 一个 / 直接量 \ \ 一个 \ 直接量 \ . 一个 . 直接量 \ * 一个 * 直接量 \ + 一个 + 直接量 \ ? 一个 ? 直接量 \ | 一个 | 直接量 \ ( 一个 ( 直接量 \ ) 一个 ) 直接量 \ [ 一个 [ 直接量 \ ] 一个 ] 直接量 \ { 一个 { 直接量 \ } 一个 } 直接量 \ XXX 由十进制数 XXX 指 定的ASCII码字符 \ Xnn 由十六进制数 nn 指定的ASCII码字符 \ cX 控制字符^X. 例如, \cI等价于 \t, \cJ等价于 \n ``` + 如果想在正则表达式中使用特殊的标点符号,必须在它们之前加上一个 \ ## 5-3.字符类匹配 + 将单独的直接符放进中括号[]内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配。 + 正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定字符尖时,要将一个 ^ 符号作为从左中括号算起的第一个字符.正则表达式的集合是 / [a-zA-z0-9] / . ``` 常用字符匹配 [...] 位于括号之内的任意字符 [^...] 不在括号之中的任意字符 . 除了换行符之外的任意字符,等价于[^\n] \w 任何单字字符, 等价于[a-zA-Z0-9] \W 任何非单字字符,等价于[^a-zA-Z0-9] \s 任何空白符,等价于[\ t \ n \ r \ f \ v] \S 任何非空白符,等价于[^\ t \ n \ r \ f \ v] \d 任何数字,等价于[0-9] \D 除了数字之外的任何字符,等价于[^0-9] [\b] 一个退格直接量(特例) ``` ## 5-4.复制 + 用以上的正则表式的语法,可以把两位数描述成 / \ d \ d /,把四位数描述成 / \d \ d \ d \ d /.但我们还没有一种方法可以用来描述具有任意多数位的数字或者是一个字符串.这个串由三个字符以及跟随在字母之后的一位数字构成.这些复杂的模式使用的正则表达式语法指定了该表达式中每个元素要重复出现的次数. ``` 指定复制的字符总是出现在它们所作用的模式后面.由于某种复制类型相当常用.所以有一些特殊的字符专门用于表示它们.例如: +号匹配的就是复制前一模式一次或多次的模式.下面的表列出了复制语法.先看一个例子: /\d{2, 4}/ //匹配2到4位间的数字. /\w{3} \d?/ //匹配三个单字字符和一个任意的数字. /\s+java\s+/ //匹配字符串"java" ,并且该串前后可以有一个或多个空格. /[^"] * / //匹配零个或多个非引号字符. ``` + 正则表达式的复制字符 字符 含义 ``` {n, m} 匹配前一项至少n次,但是不能超过m次 {n, } 匹配前一项n次,或者多次 {n} 匹配前一项恰好n次 ? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1} + 匹配前一项1次或多次,等价于{1,} * 匹配前一项0次或多次.等价于{0,} _______________________________ ``` ## 5-5.选择,分组和引用 ### + 选择。 + 字符| 用于分隔供选择的字符. ``` /ab|cd|ef/ // 匹配的是字符串 "ab",或者是字符串 "cd",又或者 /\d{3}|[a-z]{4}/ // 匹配的是要么是一个三位数,要么是四个小写字母 ``` + 分组和引用 + 在正则表达式中括号()具有几种作用.它的主要作用是把单独的项目分组成子表达式,以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目。 ***把单独的项目分组成子表达式*** ``` /java(script?) ?/ // 匹配的是字符串 "java",其后既可以有 "script",也可以没有. /(ab|cd) + |ef) / // 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复. ``` + 括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分。 ***模式中定义子模式*** ``` 例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是由于假定我们真正关心的是每个匹配尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了. ``` + 允许我们在同一正则表达式的后面引用前面的子表达式.这是通过在字符串 \ 后加一位或多位数字来实现的.数字指的是代括号的子表达式在正则表达式中的位置。 ***引用前面的字表达式*** ``` 把字符串切成连续相同字符的正则怎么写?比如abbcccdddd切成a,bb,ccc,dddd 'abbccddd'.match(/(\w)\1*/g) // ["a", "bb", "cc", "ddd"] ``` // 说明: 使用小括号()将字符作为一个最小单元,同时小括号还能记忆这个组合相匹配的字符串。再使用反斜杠\引用前面分组的表达式,数字1表示第一个小括号。这时完成了2个字符重复的要求。最后再使用*来匹配出现0次或n次。这个正则表达式就写完了。 ``` ### `$n` 在 String.replace中的应用 [RegExp.$1-$9(非标准MDN中文版)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n) 以下脚本用 [`replace()`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace) 方法去匹配一个first last格式的 name[`String`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/String) 实例 输出last first格式. 在替换文本里, 脚本用 `$1` 和 `$2` 表示正则表达式中的括号匹配项的结果. ```js let re = /(\w+)\s(\w+)/; let str = 'John Smith'; str.replace(re, '$2, $1'); // "Smith, John" RegExp.$1; // "John" RegExp.$2; // "Smith" ``` 字符 含义 ``` | 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式 (...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用 \n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数 ``` ## 5-5.指定匹配的位置 + 不指定任何一个匹配了的字符串中的字符,它们指定的是匹配所发生的合法位置.有时我们称这些元素为正则表达式的锚.因为它们将模式定位在检索字符串中的一个特定位置. + 常见锚元素 + ^ 它使模式依赖于字符串的开头。 + $ 则使模式定位在字符串的末尾。 ``` 例如: 匹配词 "javascript" ,我们可以使用正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词自身 (不像在 "javascript" 中那样作为前缀),那么我们可以使用模式 /\s java \s /, 它要求在词语java之前和之后都有空格. 但是这样作有两个问题. 第一: 如果 "java" 出现在一个字符的开头或者是结尾.该模式就不会与之匹配,除非在开头和结尾处有一个空格. 第二: 当这个模式找到一个与之匹配的字符时,它返回的匹配的字符串前端和后端都有空格,这并不是我们想要的.因此,我们使用词语的边界 \b 来代替真正的空格符 \s 进行匹配. 结果表达式是 /\b java \b/. ``` 字符 含义 ``` ^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头 $ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾 \b 匹配的是一个词语的边界(注意:[\b]匹配的是退格符) \B 匹配的是非词语的边界的字符 ``` # 6.正则的方法 + RegExp对象方法 | 方法 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [compile](http://www.w3school.com.cn/jsref/jsref_regexp_compile.asp) | 脚本执行过程中编译正则表达式。(改变和重新编译正则表达式). 已废弃 | | [exec](http://www.w3school.com.cn/jsref/jsref_exec_regexp.asp) | 检索字符串中指定的值。返回找到的值,并确定其位置。(返回一个数组,第0个为匹配的文本,之后依次为相对应的子表达式)还返回两个属性,开头和结尾的位置 | | [test](http://www.w3school.com.cn/jsref/jsref_test_regexp.asp) | 检索字符串中指定的值。返回 true 或 false。 | + 支持正则表达式的String对象方法 | 方法 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [search](http://www.w3school.com.cn/jsref/jsref_search.asp) | 检索与正则表达式相匹配的值。(对大小写不敏感,返回首次出现的位置) | | [match](http://www.w3school.com.cn/jsref/jsref_match.asp) | 找到一个或多个正则表达式的匹配。(可以找到并返回所有找到的值,是一个数组) | | [replace](http://www.w3school.com.cn/jsref/jsref_replace.asp) | 替换与正则表达式匹配的子串。 | | [split](http://www.w3school.com.cn/jsref/jsref_split.asp) | 把字符串分割为字符串数组。 | ``` match()、 replace()、 search()、indexOf()、includes() split() // str.split(/\s+/) 查找空白字符 ``` ``` const str='1a2b3c5d' undefined const reg =/\d/ str.split(reg) //(5) ["", "a", "b", "c", "d"] const str='1a2b3c5d45' const str1='1a2b3c5d45' str1.split(reg) //(7) ["", "a", "b", "c", "d", "", ""] const str2='1a2b3c5d45er3' str2.split(reg) //(8) ["", "a", "b", "c", "d", "", "er", ""] tr3= '1a2b3c5d4775er3'; str3.split(reg) (10) ["", "a", "b", "c", "d", "", "", "", "er", ""] 数字相当于分割线 ``` # 6.常用正则举例 + 校验手机号 + 是否是数字 + 是否为11位 + 数字的第二位是否为3、7、8 + 数字的第三位是否为5、6、7、8、9 ``` function checkMobile1(form) { if (form.mobile.value > "") { let reg=/1[3,7,8][5,6,7,8,9]\d{8}/; if ( form.mobile.value.match(reg)== null) { alert("请输入正确的移动手机号码!"); form.mobile.focus(); return false; } } return true; } ``` + 校验url + 必须以http:// 或 https:// 开头, + 端口号必须为在1-65535 之间, ``` let urlpatern1 =/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i; ``` + 校验用户名 ``` //用户名正则,4到16位(字母,数字,下划线,减号) let uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uPattern.test("iFat3")); ``` + 校验邮箱 ``` let email = this.value; let reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; if(reg.test(email)){ alert("邮箱格式正确"); }else{ alert("邮箱格式不正确"); } --------------------- 作者:一只程序汪 来源:CSDN 原文:https://blog.csdn.net/lanseguhui/article/details/81325818 版权声明:本文为博主原创文章,转载请附上博文链接! ``` + 校验身份证号 ``` function isCardNo(card) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if(reg.test(card) === false) { alert("身份证输入不合法"); return false; } return true } ``` + 网上号称最全正则表达式大全https://www.jianshu.com/p/a2164e370e29 + (最最全正则)[[https://regexper.com/#/%5E%5Cd%7B15,17%7D$/](https://regexper.com/#/^\d{15,17}$/)]
备案号 粤ICP备2021150107号-1