正则表达式

参考链接: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

特殊字符

字符 含义
\ 匹配规则将依照下列规则:在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前面’\’的’b’通常匹配小写’b’,无论它们出现在哪里。如果加了’\’,这个字符变成了特殊意义的字符,意思是匹配一个字符边界。反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式 /a/ 代表会匹配0个或者多个a。相反,模式 /a\/ 将 ‘‘ 的特殊性移除,从而可以匹配像 “a“ 这样的字符串。
^ 匹配输入的开始,如果多行标志被设置为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’,和”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) (var) \1 \2/中的’(foo)’和’(bar)’匹配并记住字符串”foo bar foo bar”中的前两个单词,模式中的\1 和 \2 匹配字符串的后两个单词。注意\1、\2、\n是用在正则表达式的匹配环节。
(?:x) 匹配’x’但是不记住匹配项。这种叫做非捕获括号,使得你能够定义为正则表达式运算符一起使用的子表达式。来看表达式/(?:foo){1,2}/。如果表达式是/foo{1,2}/,{1,2}将只对’foo’的最后一个字符’o’生效。如果使用非捕获括号,则{1,2}会匹配整个’foo’单词。
x(?=y) 匹配’x’仅仅当’x’后面跟着’y’,这种叫做正向肯定查找。例如,/Jack(?=Spart)/会匹配到’Jack’仅仅当他后面跟着’Spart’。/Jack(?=Spart|Frost)/匹配’Jack’仅仅当它后面跟着’Spart’或者是’Frost’。但是’Spart’和’Frost’都不是匹配结果的一部分。
x(?!y) 匹配’x’仅仅当’x’后面不跟着’y’,这个叫做正向否定查找。例如,/\d+(?!.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。
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’,也匹配”caaaaaaaandy”中的前三个a。
[xyz] 一个字符集合。匹配方括号中的任意字符,包括转义字符。你可以使用破折号( - )来指定一个字符范围。对于( . )和星号( * )这样的特许符号在一个字符集中没有特殊的意义/他们不必进行转义,不过转义也是起作用的。例如,[abcd]和[a-d]是一样的。他们都匹配”brisket”中的’b’,也都匹配”city”中的’c’。/[a-z.]+/和/[\w.]+/都匹配”test.i.ng”中的所有字符。
[^xyz] 反向字符集。也就是说,它匹配任何没有包含在反括号中的字符。你可以使得破折号( - )来指定一个字符范围。任何普通字符在这里都是起作用的。例如,[^abc]和[^a-c]是一样的。他们匹配”brisker”中的’r’,也匹配”chop”中的’h’。
[\b] 匹配一个退格(U+0008)。不要和\b混淆了。
\b 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者没有其他“字”字符在其前面的位置。注意,一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度为0.(不要和[\b]混淆了)。例如,/\bm/匹配”moon”中的”m”,/oo\b/并不匹配”oo”,因为’oo’被一个字符’n’紧跟着。/oon\b/匹配”moon”中的’oon’,因为’oon’是这个字符串的结束部分,这样他没有被一个字符紧跟着。/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远不可能同时满足没有字符跟随和有字符跟随的两种跟随情况。
\B 匹配一个非单词边界。他匹配一个前后字符都是相同类型的位置:都是字符或者都不是字符。一个字符串的开始和结尾都被认为不是字符或者空字符串。例如,/\B../匹配”noonday”中的’oo’,而/y\B../则会匹配”possibly yestarday”中的’yes’。
\cX 当X是处于A到Z之间的字符的时候。匹配字符串中的一个控制符。例如,/\cM/匹配字符串中的”control-M”(U+000D)。
\d 匹配一个数字,相当于[0-9]。例如,/\d/或者/[0-9]/匹配”B2 is the bigjj”中的’2’。
\D 匹配一个非数字字符。相当于[^0-9]。例如,/\D/或者/[^0-9]/匹配”B2 is a jj”中的B。
\f 匹配一个换页符(U+000C)。
\n 匹配一个换行符(U+000A)。
\r 匹配一个回车符(U+000D)。
\s 匹配一个空白字符,包括空格、制表符、换页符和换行符。等价于[\f\n\r\t\v\u00a0\u1680\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\s\w*/匹配”foo bar.”中的’bar’。
\S 匹配一个非空白字符。等价于[^\f\n\r\t\v\u00a0\u1680\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。例如,/\S\w*/匹配”foo bar.”中的’foo’。
\t 匹配一个水平制表符(U+0009)。
\v 匹配一个垂直制表符(U+000B)。
\w 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-Z0-9_]。例如,/\w/匹配”apple”中的’a’,”$5.28”中的’5’和”3D”中的’3’。
\W 匹配一个非单字字符。等价于[^A-Za-z0-9_]。例如,/\W/或者/[^A-Za-z0-9_]/匹配”50%”中的’%’。
\n 在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。比如/apple(,)\sorange\1/匹配”apple, orange, cherry, peach.”中的’apple, orange’。
\0 匹配NULL(U+0000)字符,不要在这后面跟其它小数,因为0<digits>是一个八进制转义序列。
\xhh 与代码hh匹配字符(两个十六进制数字)。
\uhhhh 与代码hhhh匹配字符(四个十六进制数字)。
\u{hhhh} (仅当设置了u标志时)使用Unicode值hhhh匹配字符(十六进制数字)。

正则表达式标志

标志 描述
g 全局搜索。
i 不区分大小写搜索。
m 多行搜索。
y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。

常用正则表达式

校验数字的表达式

  • 数字:^[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_]+$
  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  • 可以输入含有^%&’,;=?$\”等字符:[^%&’,;=?$\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}
  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
  • 帐号是否合法(字母开头,允许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])[a-zA-Z0-9]{8,10}$
  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在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地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

钱的输入格式

  • 有四种钱的表示形式我们可以接受:”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})?$
  • “+”可以用”*”替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
坚持技术分享,您的支持将鼓励我继续创作!