前端开发中的 正则表达式 及常用正则表达式大全
RegExp 是正则表达式(Regular expression)的缩写,就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 ‘a’ 和 任意个 ‘b’ ”,那么 ‘ab’, ‘abb’, ‘abbbbbbbbbb’ 都符合这个特征。
正则表达式可以用来:
- 验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。
- 用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。
- 用来替换,比普通的替换更强大。
创建一个正则表达式
你可以使用以下两种方法之一构建一个正则表达式:
方法一、使用一个正则表达式字面量,其由包含在斜杠之间的模式组成,如下所示:
- /*
- /pattern/flags
- */
- const regex = /ab+c/;
- const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi;
在加载脚本后,正则表达式字面值提供正则表达式的编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
方法二、调用RegExp对象的构造函数,如下所示:
- /*
- new RegExp(pattern [, flags])
- */
- let regex = new RegExp("ab+c");
- let regex = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$, "gi");
- let regex = new RegExp("^[a-zA-Z]+[0-9]*\W?_$", "gi");
使用构造函数提供正则表达式的运行时编译。使用构造函数,当你知道正则表达式模式将会改变,或者你不知道模式,并从另一个来源,如用户输入。
参数说明
- 参数
pattern
是一个字符串,指定了正则表达式的模式或其他正则表达式。 - 参数 [, flags] 是一个可选的字符串,包含属性
g
(global,全局搜索)、i
(ignoreCase,不区分大小写搜索)和m
(multiline,多行搜索)。
ECMAScript 标准化之前,不支持 m
属性。如果 pattern
是正则表达式,而不是字符串,则必须省略该参数。
正则表达式的匹配规则
一个正则表达式模式是由简单的字符所构成的,比如/abc/, 或者是简单和特殊字符的组合,比如 /abc/ 或 /Chapter (\d+).\d/。后者用到了括号,它在正则表达式中可以被用作是一个记忆设备。这一部分正则所匹配的字符将会被记住,在后面可以被利用。正如 使用括号的子字符串匹配
使用简单的模式
简单的模式是由你找到的直接匹配所构成的。比如,/abc/这个模式就匹配了在一个字符串中,仅仅字符 ‘abc’ 同时出现并按照这个顺序。在 “Hi, do you know your abc’s?” 和 “The latest airplane designs evolved from slabcraft.” 就会匹配成功。在上面的两个实例中,匹配的是子字符串 ‘abc’。在字符串 “Grab crab” 中将不会被匹配,因为它不包含任何的 ‘abc’ 子字符串。
使用特殊字符
当你需要搜索一个比直接匹配需要更多条件的匹配时,比如寻找一个或多个 ‘b’,或者寻找空格,那么这时模式将要包含特殊字符。比如, 模式/abc/匹配了一个单独的 ‘a’ 后面跟了零个或者多个 ‘b’(的意思是前面一项出现了零个或者多个),且后面跟着 ‘c’ 的任何字符组合。在字符串 “cbbabbbbcdebc” 中,这个模式匹配了子字符串 “abbbbc”。
下面的表格列出了一个我们在正则表达式中可以利用的特殊字符的完整列表和描述。
字符 | 含义 |
---|---|
\ |
匹配将依照下列规则:
在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前面’\’的’b’通常匹配小写’b’,无论它们出现在哪里。如果加了’\’,这个字符变成了一个特殊意义的字符,意思是匹配一个字符边界。 反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式 /a*/ 代表会匹配 0 个或者多个 a。相反,模式 /a\*/ 将 ‘*’ 的特殊性移除,从而可以匹配像 “a*” 这样的字符串。 使用 new RegExp(“pattern”) 的时候不要忘记将 \ 进行转义,因为 \ 在字符串里面也是一个转义字符。 |
^ |
匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
例如,/^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。 当 ‘^’ 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。补充字符集合一节有详细介绍和示例。 |
$ |
匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
例如,/t$/ 并不会匹配 “eater” 中的 ‘t’,但是会匹配 “eat” 中的 ‘t’。 |
* |
匹配前一个表达式0次或多次。等价于 {0,}。
例如,/bo*/会匹配 “A ghost boooooed” 中的 ‘booooo’ 和 “A bird warbled” 中的 ‘b’,但是在 “A goat grunted” 中将不会匹配任何东西。 |
+ |
匹配前面一个表达式1次或者多次。等价于 {1,}。
例如,/a+/匹配了在 “candy” 中的 ‘a’,和在 “caaaaaaandy” 中所有的 ‘a’。 |
? |
匹配前面一个表达式0次或者1次。等价于 {0,1}。
例如,/e?le?/ 匹配 “angel” 中的 ‘el’,和 “angle” 中的 ‘le’ 以及”oslo’ 中的’l’。 如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。 例如,对 “123abc” 应用 /\d+/ 将会返回 “123”,如果使用 /\d+?/,那么就只会匹配到 “1”。 还可以运用于先行断言,如本表的 |
. |
(小数点)匹配除换行符之外的任何单个字符。
例如,/.n/将会匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不会匹配 ‘nay’。 |
(x) |
匹配 ‘x’ 并且记住匹配项,就像下面的例子展示的那样。括号被称为 捕获括号。
模式 /(foo) (bar) \1 \2/ 中的 ‘(foo)’ 和 ‘(bar)’ 匹配并记住字符串 “foo bar foo bar” 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词。注意 \1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法,例如,’bar foo’.replace( /(…) (…)/, ‘$2 $1’ )。 |
(?:x) |
匹配 ‘x’ 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。来看示例表达式 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。 |
x(?=y) |
匹配’x’仅仅当’x’后面跟着’y’.这种叫做正向肯定查找。
例如,/Jack(?=Sprat)/会匹配到’Jack’仅仅当它后面跟着’Sprat’。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着’Sprat’或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。 |
x(?!y) |
匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找。
例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec(“3.141”)匹配‘141’但是不是‘3.141’ |
x|y |
匹配‘x’或者‘y’。
例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’ |
{n} |
n是一个正整数,匹配了前面一个字符刚好发生了n次。
比如,/a{2}/不会匹配“candy”中的’a’,但是会匹配“caandy”中所有的a,以及“caaandy”中的前两个’a’。 |
{n,m} |
n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。
例如,/a{1, 3}/ 并不匹配“cndy”中得任意字符,匹配“candy”中得a,匹配“caandy”中得前两个a,也匹配“caaaaaaandy”中得前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。 |
[xyz] |
一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。
例如,[abcd] 和[a-d]是一样的。他们都匹配”brisket”中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中得所有字符。 |
[^xyz] |
一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的。
例如,[^abc] 和 [^a-c] 是一样的。他们匹配”brisket”中得‘r’,也匹配“chop”中的‘h’。 |
[\b] |
匹配一个退格(U+0008)。(不要和\b混淆了。) |
\b |
匹配一个词的边界。一个词的边界就是一个词不被另外一个词跟随的位置或者不是另一个词汇字符前边的位置。注意,一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了)
例子: /\bm/匹配“moon”中得‘m’; /oo\b/并不匹配”moon”中得’oo’,因为’oo’被一个词汇字符’n’紧跟着。 /oon\b/匹配”moon”中得’oon’,因为’oon’是这个字符串的结束部分。这样他没有被一个词汇字符紧跟着。 /\w\b\w/将不能匹配任何字符串,因为一个单词中的字符永远也不可能被一个非词汇字符和一个词汇字符同时紧跟着。 注意: JavaScript的正则表达式引擎将特定的字符集定义为“字”字符。不在该集合中的任何字符都被认为是一个断词。这组字符相当有限:它只包括大写和小写的罗马字母,小数位数和下划线字符。不幸的是,重要的字符,例如“é”或“ü”,被视为断词。
|
\B |
匹配一个非单词边界。他匹配一个前后字符都是相同类型的位置:都是单词或者都不是单词。一个字符串的开始和结尾都被认为是非单词。
例如,/\B../匹配”noonday”中得’oo’, 而/y\B./匹配”possibly yesterday”中得’ye‘ |
\cX |
当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。
例如, |
\d |
匹配一个数字。
例如, |
\D |
匹配一个非数字字符。
例如, |
\f |
匹配一个换页符 (U+000C)。 |
\n |
匹配一个换行符 (U+000A)。 |
\r |
匹配一个回车符 (U+000D)。 |
\s |
匹配一个空白字符,包括空格、制表符、换页符和换行符。
等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。 例如, |
\S |
匹配一个非空白字符。
等价于 例如, |
\t |
匹配一个水平制表符 (U+0009)。 |
\v |
匹配一个垂直制表符 (U+000B)。 |
\w |
匹配一个单字字符(字母、数字或者下划线)。
等价于 例如, |
\W |
匹配一个非单字字符。
等价于 例如, |
\n |
当 n 是一个正整数,一个返回引用到最后一个与有n插入的正值表达式(counting left parentheses)匹配的副字符串。
比如 |
\0 |
匹配 NULL (U+0000) 字符, 不要在这后面跟其它小数,因为 \0<digits> 是一个八进制转义序列。 |
\xhh |
与代码 hh 匹配字符(两个十六进制数字) |
\uhhhh |
与代码 hhhh 匹配字符(四个十六进制数字)。 |
\u{hhhh} |
(仅当设置了u标志时) 使用Unicode值hhhh匹配字符 (十六进制数字). |
RegExp 对象方法
正则表达式可以被用于RegExp的exec和test方法以及 String的match、replace、search和split方法。
test()
test() 方法检索字符串中是否存在指定的值。返回值是 true 或 false。
- var patt1 = new RegExp('e');
- console.log(patt1.test('some text'));
- // OUTPUT:true
- var patt2 = new RegExp('ee');
- console.log(patt2.test('some text'));
- // OUTPUT:false
- // 判断是不是QQ号
- // 1 首位不能是0 ^[1-9]
- // 2 必须是 [5, 11] 位的数字 \d{4, 9}
- var str = '80583600';
- var regexp = /^[1-9][0-9]{4,10}$/gim;
- if (regexp.test(str)) {
- alert('is');
- } else {
- alert('no');
- }
exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
- var patt1 = new RegExp('e');
- console.log(patt1.exec('some text'));
- // OUTPUT:e
- var patt2 = new RegExp('ee');
- console.log(patt2.exec('some text'));
- // OUTPUT:null
compile()
compile() 既可以改变检索模式,也可以添加或删除第二个参数。
- var patt1=new RegExp("e");
- document.write(patt1.test("The best things in life are free")); // true
- // 改变了检索模式
- patt1.compile("eee");
- document.write(patt1.test("The best things in life are free")); // false
支持正则表达式的 String 对象的方法
search 检索与正则表达式相匹配的值。
- var str = "Visit W3School!"
- console.log(str.search(/W3School/))
- // OUTPUT:6
match 找到一个或多个正则表达式的匹配。
- var str="1 plus 2 equal 3"
- console.log(str.match(/\d+/g))
- // OUTPUT:1,2,3
replace 替换与正则表达式匹配的子串。
- var str = "Visit Microsoft!"
- console.log(str.replace(/Microsoft/, "W3School"));
- // OUTPUT:Visit W3School!
- // 找重复项最多的字符个数
- var str = 'g21ss4aeba_ersb43sgnnsssstht6sss60snnsj8resw0_ss';
- // split : 将字符串转化为数组
- // sort : 对数组排序,ASCII
- // join : 将数组转化为字符串
- var str_new = str.split('').sort().join('');
- document.write(str + '
'); - document.write(str.split('') + '
'); - document.write(str.split('').sort() + '
'); - document.write(str.split('').sort().join('') + '
'); - // 匹配字符,且重复这个字符,重复次数至少一次。
- var regexp = /(\w)\1+/g;
- var index = 0;
- var value = '';
- str_new.replace(regexp, function($0, $1) {
- // document.write($0);
- // document.write($1);
- if (index < $0.length) {
- index = $0.length;
- value = $1;
- }
- });
- document.write('重复项最多的字符是:' + value + ',个数是:' + index);
- // OUTPUT:
- // 0012344668__aabbeeegghjnnnnrrssssssssssssssssttw
- // 重复项最多的字符是:s,个数是:16
split 把字符串分割为字符串数组。
- var str = "How are you doing today?"
- document.write(str.split(/\s+/));
- // OUTPUT:How,are,you,doing,today?
常用正则表达式收集
用户名正则
- //用户名正则,4到16位(字母,数字,下划线,减号)
- var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;
- //输出 true
- console.log(uPattern.test("caibaojian"));
密码强度正则
- //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
- var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
- //输出 true
- console.log("=="+pPattern.test("caibaojian#"));
整数正则
- //正整数正则
- var posPattern = /^\d+$/;
- //负整数正则
- var negPattern = /^-\d+$/;
- //整数正则
- var intPattern = /^-?\d+$/;
- //输出 true
- console.log(posPattern.test("42"));
- //输出 true
- console.log(negPattern.test("-42"));
- //输出 true
- console.log(intPattern.test("-42"));
数字正则
可以是整数也可以是浮点数
- //正数正则
- var posPattern = /^\d*\.?\d+$/;
- //负数正则
- var negPattern = /^-\d*\.?\d+$/;
- //数字正则
- var numPattern = /^-?\d*\.?\d+$/;
- console.log(posPattern.test("42.2"));
- console.log(negPattern.test("-42.2"));
- console.log(numPattern.test("-42.2"));
Email正则
- //Email正则
- var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
- //输出 true
- console.log(ePattern.test("99154507@qq.com"));
手机号码正则
- //手机号正则
- var mPattern = /^1[34578]\d{9}$/; //http://caibaojian.com/regexp-example.html
- //输出 true
- console.log(mPattern.test("15507621888"));
身份证号正则
- //身份证号(18位)正则
- var cP = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
- //输出 true
- console.log(cP.test("11010519880605371X"));
注:身份号码验证建议查看《关于身份证号码验证的几个实用函数》
URL正则
- //URL正则
- var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
- //输出 true
- console.log(urlP.test("http://caibaojian.com"));
IPv4地址正则
- //ipv4地址正则
- var ipP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
- //输出 true
- console.log(ipP.test("115.28.47.26"));
十六进制颜色正则
- //RGB Hex颜色正则
- var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
- //输出 true
- console.log(cPattern.test("#b8b8b8"));
日期正则
- //日期正则,简单判定,未做月份及日期的判定
- var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
- //输出 true
- console.log(dP1.test("2017-05-11"));
- //输出 true
- console.log(dP1.test("2017-15-11"));
- //日期正则,复杂判定
- var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
- //输出 true
- console.log(dP2.test("2017-02-11"));
- //输出 false
- console.log(dP2.test("2017-15-11"));
- //输出 false
- console.log(dP2.test("2017-02-29"));
QQ号码正则
- //QQ号正则,5至11位
- var qqPattern = /^[1-9][0-9]{4,10}$/;
- //输出 true
- console.log(qqPattern.test("65974040"));
微信号正则
- //微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
- var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;
- //输出 true
- console.log(wxPattern.test("caibaojian_com"));
车牌号正则
- //车牌号正则
- var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
- //输出 true
- console.log(cPattern.test("浙AKP053"));
包含中文正则
- //包含中文正则
- var cnPattern = /[\u4E00-\u9FA5]/;
- //输出 true
- console.log(cnPattern.test("愚人码头"));
校验数字的表达式
- 数字:
^[0-9]*$
- n位的数字:
^\d{n}$
- 至少n位的数字:
^\d{n,}$
- m-n位的数字:
^\d{m,n}$
- 零和非零开头的数字:
^(0|[1-9][0-9]*)$
- 非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
- 带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})?$
- 正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
- 有两位小数的正实数:
^[0-9]+(.[0-9]{2})?$
- 有1~3位小数的正实数:
^[0-9]+(.[0-9]{1,3})?$
- 非零的正整数:
^[1-9]\d*$
或^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
- 非零的负整数:
^\-[1-9][]0-9"*$
或^-[1-9]\d*$
- 非负整数:
^\d+$
或^[1-9]\d*|0$
- 非正整数:
^-[1-9]\d*|0$
或^((-\d+)|(0+))$
- 非负浮点数:
^\d+(\.\d+)?$
或^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
- 非正浮点数:
^((-\d+(\.\d+)?)|(0+(\.0+)?))$
或^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
- 正浮点数:
^[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]*))$
- 负浮点数:
^-([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]*)))$
- 浮点数:
^(-?\d+)(\.\d+)?$
或^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
校验字符的表达式
- 汉字:
^[\u4e00-\u9fa5]{0,}$
- 英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
- 长度为3-20的所有字符:
^.{3,20}$
- 由26个英文字母组成的字符串:
^[A-Za-z]+$
- 由26个大写英文字母组成的字符串:
^[A-Z]+$
- 由26个小写英文字母组成的字符串:
^[a-z]+$
- 由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:
^\w+$ 或 ^\w{3,20}$
- 中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
- 可以输入含有^%&’,;=?$\”等字符:
[^%&',;=?$\x22]+
- 禁止输入含有~的字符:
[^~\x22]+
特殊需求表达式
- Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
- 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
- InternetURL:
[a-zA-z]+://[^\s]*
或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
- 手机号码:
^(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}$
- 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
- 国内电话号码(0511-4405222、021-87888822):
\d{3}-\d{8}|\d{4}-\d{7}
- 身份证号(15位、18位数字):
^\d{15}|\d{18}$
- 短身份证号码(数字、字母x结尾):
^([0-9]){7,18}(x|X)?$
或^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
- 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 日期格式:
^\d{4}-\d{1,2}-\d{1,2}
- 一年的12个月(01~09和1~12):
^(0?[1-9]|1[0-2])$
- 一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
- xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
- 中文字符的正则表达式:
[\u4e00-\u9fa5]
- 双字节字符:
[^\x00-\xff]
(包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)) - 空白行的正则表达式:
\n\s*\r
(可以用来删除空白行) - HTML标记的正则表达式:
< (\S*?)[^>]*>.*?|< .*? />
(网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力) - 首尾空白字符的正则表达式:
^\s*|\s*$或(^\s*)|(\s*$)
(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) - 腾讯QQ号:
[1-9][0-9]{4,}
(腾讯QQ号从10000开始) - 中国邮政编码:
[1-9]\d{5}(?!\d)
(中国邮政编码为6位数字) - IP地址:
\d+\.\d+\.\d+\.\d+
(提取IP地址时有用) - IP地址:
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
- 港澳居民来往内地通行证号码验证正则:
/^([A-Z]\d{6,10}(\(\w{1}\))?)$/
- 护照验证正则:
/^(P\d{7}|G\d{7,8}|TH\d{7,8}|S\d{7,8}|A\d{7,8}|L\d{7,8}|\d{9}|D\d+|1[4,5]\d{7})$/
注:身份号码验证建议查看《关于身份证号码验证的几个实用函数》
钱的输入格式:
- 有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:
^[1-9][0-9]*$
- 这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:
^(0|[1-9][0-9]*)$
- 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:
^(0|-?[1-9][0-9]*)$
- 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:
^[0-9]+(.[0-9]+)?$
- 必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的:
^[0-9]+(.[0-9]{2})?$
- 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:
^[0-9]+(.[0-9]{1,2})?$
- 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
- 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
备注:这就是最终结果了,别忘了”+”可以用”*”替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
更多收集的正则
常见的 正则表达式 校验:QQ号、手机号、Email、是否是数字、去掉前后空格、是否存在中文、邮编、身份证、URL、日期格式、IP
- var myRegExp = {
- // 检查字符串是否为合法QQ号码
- isQQ: function(str) {
- // 1 首位不能是0 ^[1-9]
- // 2 必须是 [5, 11] 位的数字 \d{4, 9}
- var reg = /^[1-9][0-9]{4,9}$/gim;
- if (reg.test(str)) {
- console.log('QQ号码格式输入正确');
- return true;
- } else {
- console.log('请输入正确格式的QQ号码');
- return false;
- }
- },
- // 检查字符串是否为合法手机号码
- isPhone: function(str) {
- var reg = /^(0|86|17951)?(13[0-9]|15[012356789]|18[0-9]|14[57]|17[678])[0-9]{8}$/;
- if (reg.test(str)) {
- console.log('手机号码格式输入正确');
- return true;
- } else {
- console.log('请输入正确格式的手机号码');
- return false;
- }
- },
- // 检查字符串是否为合法Email地址
- isEmail: function(str) {
- var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
- // var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
- if (reg.test(str)) {
- console.log('Email格式输入正确');
- return true;
- } else {
- console.log('请输入正确格式的Email');
- return false;
- }
- },
- // 检查字符串是否是数字
- isNumber: function(str) {
- var reg = /^\d+$/;
- if (reg.test(str)) {
- console.log(str + '是数字');
- return true;
- } else {
- console.log(str + '不是数字');
- return false;
- }
- },
- // 去掉前后空格
- trim: function(str) {
- var reg = /^\s+|\s+$/g;
- return str.replace(reg, '');
- },
- // 检查字符串是否存在中文
- isChinese: function(str) {
- var reg = /[\u4e00-\u9fa5]/gm;
- if (reg.test(str)) {
- console.log(str + ' 中存在中文');
- return true;
- } else {
- console.log(str + ' 中不存在中文');
- return false;
- }
- },
- // 检查字符串是否为合法邮政编码
- isPostcode: function(str) {
- // 起始数字不能为0,然后是5个数字 [1-9]\d{5}
- var reg = /^[1-9]\d{5}$/g;
- // var reg = /^[1-9]\d{5}(?!\d)$/;
- if (reg.test(str)) {
- console.log(str + ' 是合法的邮编格式');
- return true;
- } else {
- console.log(str + ' 是不合法的邮编格式');
- return false;
- }
- },
- // 检查字符串是否为合法身份证号码
- isIDcard: function(str) {
- var reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
- if (reg.test(str)) {
- console.log(str + ' 是合法的身份证号码');
- return true;
- } else {
- console.log(str + ' 是不合法的身份证号码');
- return false;
- }
- },
- // 检查字符串是否为合法URL
- isURL: function(str) {
- var reg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i;
- if (reg.test(str)) {
- console.log(str + ' 是合法的URL');
- return true;
- } else {
- console.log(str + ' 是不合法的URL');
- return false;
- }
- },
- // 检查字符串是否为合法日期格式 yyyy-mm-dd
- isDate: function(str) {
- var reg = /^[1-2][0-9][0-9][0-9]-[0-1]{0,1}[0-9]-[0-3]{0,1}[0-9]$/;
- if (reg.test(str)) {
- console.log(str + ' 是合法的日期格式');
- return true;
- } else {
- console.log(str + ' 是不合法的日期格式,yyyy-mm-dd');
- return false;
- }
- },
- // 检查字符串是否为合法IP地址
- isIP: function(str) {
- // 1.1.1.1 四段 [0 , 255]
- // 第一段不能为0
- // 每个段不能以0开头
- //
- // 本机IP: 58.50.120.18 湖北省荆州市 电信
- var reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/gi;
- if (reg.test(str)) {
- console.log(str + ' 是合法的IP地址');
- return true;
- } else {
- console.log(str + ' 是不合法的IP地址');
- return false;
- }
- }
- }
- // 测试
- // console.log(myRegExp.isQQ('80583600'));
- // console.log(myRegExp.isPhone('17607160722'));
- // console.log(myRegExp.isEmail('80583600@qq.com'));
- // console.log(myRegExp.isNumber('100a'));
- // console.log(myRegExp.trim(' 100 '));
- // console.log(myRegExp.isChinese('baixiaoming'));
- // console.log(myRegExp.isChinese('小明'));
- // console.log(myRegExp.isPostcode('412345'));
- // console.log(myRegExp.isIDcard('42091119940927001X'));
- // console.log(myRegExp.isURL('https://www.baidu.com/'));
- // console.log(myRegExp.isDate('2017-4-4'));
- // console.log(myRegExp.isIP('1.0.0.0'));