美文网首页
正则表达式: 各字符的解读

正则表达式: 各字符的解读

作者: Jason_风筝 | 来源:发表于2020-04-18 14:23 被阅读0次

    记录解读~~
    说明参考

    简单说明
    e.g:/^\d$/ig
    /i (忽略大小写)
    /g (全文查找出现的所有匹配字符)
    /m (多行查找)
    /gi(全文查找、忽略大小写)
    /ig(全文查找、忽略大小写)

    * : 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
    +: 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
    ?: 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。
    {n,m}: m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
    ?: 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
    \b: 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
    \B: 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
    \d: 匹配一个数字字符。等价于 [0-9]。
    \D: 匹配一个非数字字符。等价于 [^0-9]。
    \s: 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    \S: 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    \w: 匹配字母、数字、下划线。等价于[A-Za-z0-9_]。
    \W: 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]。
    |: 或修饰,一般在()中使用
    

    一、校验数字的表达式

    • 数字:^[0-9]*$
    ^: 表示开头
    [0-9]: 中括号表达式
    *: 限定符, 表示0次或者多次
    $: 表示结尾
    
    • n位的数字:^\d{n}$
    \d: 表示匹配数字, 相当于[0-9]
    {n}: 是限定符,表示n位 
    
    • 至少n位的数字:^\d{n,}$
    {n,}: 是限定符, 逗号后面没有具体的值, 表示n个以上,包括n
    
    • m-n位的数字:^\d{m,n}$
    {m,n}: 指明限制条件 m-n , 包括m, n
    
    • 零和非零开头的数字:^(0|[1-9][0-9]*)$
    (): 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
    |: 在这里表示或者
    0|: 0或者后者
    [1-9]: 表示只能出现1-9
    [0-9]*: 在这里它俩是一个整体, * 修饰前面的[0-9], * 表示0次或者多次, 整体表示: 0-9可能出现0次或者多次
    [1-9][0-9]*: 第一位肯定是1-9, 从第二位开始可以没, 也可能是无穷,但这些值只能在0-9中取, 所以是 1- 无限, 都可以匹配
    
    • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
    ^([1-9][0-9]*)+ : [1-9][0-9]*, 是非零开头的数字, + 是表示()中至少有一位
    \. : \是转义的, 如果不用转义, . 表示除了换行符的所有字符 所以这里有个 .
    [0-9]{1,2} , 0-9, 取1位或者2位
    后面的?: 表示匹配0次或者1次, 在这里就表示可能有, 可能没 
    
    • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
    ^(\-)?: ()中的\-, 转义了-, 所以是-开始,但又是?非贪婪限定符, 表示开头的- 可能有,也可能无
    \d+: 相当于[0-9]{1,} , 匹配数字, 至少一位
    (\.\d{1,2}): \. 用了转义, 就表示.
    \d 是[0-9]
    {1,2}: 限定符, 1-2位, 包括1和2
    
    • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
    ^(\-|\+)?: 开头可能是 - , 也可能是+ , 也可能 -+ 都没有
    \d+: 至少有一位数字
    (\.\d+): 点(数字结尾), 至少有一个数字
    (\.\d+)?$: ?: 可能有, 也可能没有结尾, 所以解读是: 有可能有结尾,也可能, 如果有一定是.x 结尾, 到.后至少一位
    
    • 可能有两位小数的正实数, 也可以没有小数:^[0-9]+(\.[0-9]{2})?$
    ^[0-9]+: 0-9 , 至少一位开头
    (\.[0-9]{2})?$: 可能没有结尾, 如果有, 一定是.xx , xx 表示0-9的数字
    
    • 可能有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
    和上面那条差不多, 不同的是这里用到了限定符{1,3}, 所以规定了只能1-3位
    
    • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*)$ 或 ^\+?[1-9][0-9]*$
    \d: 相当于[0-9]
    *: 表示0次或者多次
    \+?: 转义了+, ?: 表示可能有可能无
    
    • 非零的负整数:^\-[1-9][0-9]*$ 或 ^-[1-9]\d*$
    ^\-: - 开头
    
    • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
    ^\d+$: 至少有一次的0-9
    ^[1-9]\d*|0$: 或者0
    
    • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
    ^((-\d+)|(0+))$: -\d+, 至少有一个 -(0-9) 或者 0
    
    • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    ^\d+: 以0-9开头, 至少一个
    (\.\d+)?: 可能有, 可能无, 有的话是 .(至少[0-9]一位)
    
    • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    ^((-\d+(\.\d+)?)
    -\d+: 至少有一位 - 的0-9
    (\.\d+)?: 可能有, 也可能无, 有的话, 是 至少一位 . [0-9]
    | : 或
    0+: 相当于0{1,} 
    (\.0+)?: 可能有, 也可能无, 有的话是至少 .0 / .00000.... 都是合法的
    
    • 正浮点数:^[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*: 开头是: [1-9][0-9]{0,} , 就是 最少是1开始, 后面无限
    \.\d+:  .[0-9]{1,}
    |: 或
    \.\d*:  .[0-9]{0,}
    [1-9]\d*:  [1-9][0-9]{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]*)))$
    
    
    • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
    ^(-?\d+): 可能是以- [0-9]{1,} 开头, 也可能没有-
    (\.\d+)?$: 可能是以.[0-9]{1,} 结尾, 也可能没有尾
    

    二、校验字符的表达式

    • 汉字:^[\u4e00-\u9fa5]{0,}$
    \u4e00-\u9fa5: 是汉字ASCII码表上的表示
    {0,}: 可能无, 也可能无限个
    
    • 英文和数字:^[A-Za-z0-9]+$
    ^[A-Za-z0-9]+$: 以字母数字开头和结尾, 至少有一个才会匹配到
    
    
    • 长度为3-20的所有字符:^.{3,20}$
    . :  表示除了换行符的所有字符
    {3,20}: 限定符
    
    • 由26个英文字母组成的字符串:^[A-Za-z]+$
    +: 表示至少有一个, 相当{1,}
    
    • 由26个大写英文字母组成的字符串:^[A-Z]+$
    ^[A-Z]+$: 开头结束都只能是A-Z , 至少一个, 不限制最大数
    
    • 由26个小写英文字母组成的字符串:^[a-z]+$
    同上
    
    • 由数字、26个英文字母或者下划线组成的字符串:^\w+$
    \w: 表示[A-Za-z0-9_] , 注意还有_
    ^\w+$: 至少有一个[A-Za-z0-9_], 开头和结尾, 不限最大位数
    
    • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 或 ^[\u4E00-\u9FA5\w]+
    \u4E00-\u9FA5: 中文
    
    • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$
    不要_
    
    • 可以输入含有^%&',;=?\"等字符:`[\^%&',;=?\x22]+`
    \^: 这里必须要转义, 因为如果不加转义, 就表示^, 当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合
    \x22(\xn): 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。所以\x22: 是表示双引号(")
    
    • 禁止输入含有~的字符:[^~]+ 或 ^[^~]+$
    [^~]+: 表示除了~ 其他都匹配到
    ^[^~]+$: 表示整段string 如果包含有~都不匹配
    

    三、特殊需求表达式

    • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    首先我们要知道: email 的格式是 xxx@xxx.xxx  xxx 表示{1,}
    所以这条正则是匹配到简的email 格式
    ^\w+: [A-Za-z0-9_]至少一个, 至多不限
    ([-+.]\w+)*: (-+.[A-Za-z0-9_]), * 表示: {0,} , 
    @: 就是@
    \w+([-.]\w+)*: 同上
    \.: 转义了. , 所以就代表.
    \w+([-.]\w+)*$: 以[A-Za-z0-9_]结尾 , 可能尾数还有 -.[A-Za-z0-9_] , 也可能没有
    
    • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
    [a-zA-Z0-9][-a-zA-Z0-9]{0,62}: 表示第一位只能是a-zA-Z0-9中选择, 后面的可能无/有, 限制是{0,62},可选择的值为: [-a-zA-Z0-9]
    (\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+: ()中的至少有一项
    最后的\.?: 表示可能有. 也可能没有
    
    • InternetURL:[a-zA-z]+://[^\s]*
    [a-zA-z]+: 至少有一个字母
    ://:  在这里就表示://
    \s: 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
    \S: 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
    [^\s]*: 也可以写成[\S]*, 表示如果有, 也只能是任何非空白字符
    
    • 手机号码:^(13[0-9]|14[5|7]|15[0-9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    ^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]): 开头| 是或者的意思, [0-9]默认是匹配一位, 所以开头最多三位,13 14 15 18 就代表这些数字
    \d{8}$: 结尾是数字结尾, 一个是8位
    
    • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
    \(: 就是转义( , 表示匹配(
    \d{3,4}-: 3-4位的数字和-
    ^(\(\d{3,4}-): (三到四位的数字开头和-)
    |: 或者
    \d{3.4}-: 这里匹配没有()的三到四位的数字开头和-
    ^(\(\d{3,4}-)|\d{3.4}-)?: 最后的?表示可能是以这开头, 也可能没有
    \d{7,8}$: 结尾肯定是七或八位的数字
    
    • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
    \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{1-4})|(\d{7,8})-(\d{1-4}))$)
    \d: 相当于[0-9]
    (\d{11})|: 十一位数字或者
    ^((\d{7,8}): 七或者八位数字
    (\d{4}|\d{3})-(\d{7,8}): 三或四位-七或八位
    (\d{4}|\d{3})-(\d{7,8})-(\d{1-4}): (三或四位-七或八位)-(一位或二位或三或四数字)
    (\d{7,8})-(\d{1-4}): 七或八位数字-三或四位数字
    
    • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
    (^\d{15}$): 以十五位数字开始和结尾
    (^\d{18}$): 以十八位数字开始和结尾
    (^\d{17}(\d|X|x)$): 十七位数字开头, 一位数字或X或x结尾
    
    • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    ^[a-zA-Z]: 开头是a-zA-Z
    [a-zA-Z0-9_]{4,15}: {4,15}是修饰前面的[a-zA-Z0-9_], 加上第一位, 所以是{5,16}
    
    • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
    ^[a-zA-Z]: 开头是字母
    \w{5,17}$: \w相当于[A-Za-z0-9_],{5,17}的解释同上, 加上前面的一位,所以是{6,18}
    
    • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
      ref:
    用到了分组
    * : 匹配前面的子表达式零次或多次, 相当于: {0,}
    . : 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式
    .*: 匹配任意文本
    ?=: 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    (?=.*\d): 相当于(?=.{0,}[0-9]) , 匹配(零次或多次除换行符(\n、\r)之外的任何单个字符)前面的值, 剩下数字, 表示一定要匹配数字
    (?=.*[a-z])(?=.*[A-Z]): 同上
    如果想也一定要匹配_:  `^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*_)[\w]{8,10}$`
    
    • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
    和上一条差不多
    .: 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式
    所以是可以有特殊字符, 但大小写字母和数字是一定要
    (?=.*\d): \d表示一定要, 但最后的表达式一定要包括\d
    
    • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
    ^\d{4}-\d{1,2}-\d{1,2}: 四位数字-一或者二位数字-一或者二位数字
    
    • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
    0?[1-9]: 0可能有也可能无,但只能配一到九
    |: 或
    1[0-2]: 就是表示10,11,12
    
    • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
    (0?[1-9]): 有没0都可以,后面是1-9
    ((1|2)[0-9]): (1|2): 一或二, [0-9]: 就是0到9, 如果没特指几位, 默认是一位
    |30|31: 或30或31
    
    钱的输入格式:

    有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$

    [1-9]: 一位
    [0-9]*: *相当{0,}
    

    这表示任意一个不以0开头的数字,但可以是0:^(0|[1-9][0-9]*)$

    开头0先独立出去
    [1-9]: 取一位
    [0-9]*: [0-9]{0,} 
    

    一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

    0|-?: 0或者-, 可能有也可能无
    [1-9][0-9]*: 1-无穷的整数
    

    必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.0" 是通过的:^[0-9]+(.[0-9]{1,})?$

    [0-9]+: 至少有一位
    (.[0-9]{1,})?: 可以没有,如果有.后面必须是0-9的2位
    

    这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

    [0-9]{1,3}: 一到三位的0-9
    (,[0-9]{3})*: (, 0-9), 三位,可能有无数次也可以0次
    (.[0-9]{1,2}: (.0-9), 一到两位
    ?: 可能无,可能有
    

    1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

    备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

    • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
    [a-zA-Z]+: 这里的+是{1,}
    -?: 就是-{0,1}
    ([a-zA-Z]+-?)+: 大小字母开,-可有可无
    \.[x|X][m|M][l|L]$: 大小写的xml 都匹配
    
    • 中文字符的正则表达式:[\u4e00-\u9fa5]
    • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
    • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
    • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
    \S: 注意这里是大S, 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
    /s: 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    (\S*?): 匹配任何非空白字符, 可能有可能无
    [^>]*: 相当[^>]{0,} , 不管有多少个>都排队
    <(\S*?)[^>]*>: <(匹配任何非空白字符, 可能有可能无,排除>)>
    . : 匹配除换行符(\n、\r)之外的任何单个字符
    .*?: 匹配{0,}次的除换行符之外的任何字符, 没有也可以
    <.*?/>: <(除换行符任何字符都行,没有也行)/>
    
    • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
    [1-9][0-9]{4,}: 至少5位, 从10000开始
    
    • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
    ?!: 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    当前向查找分组里面的正则表达式匹配失败的时候才继续后面的匹配过程
    [1-9]\d{5}(?!\d): 会以分组的形式返回, 比如678788kjhk878888, 它会匹配到 678788 & 878888
    
    • (?:pattern): 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    • 香港电话: /^((?!999)([2-9][0-9]{7}))$/

    (?!999): ?! , 正向否定预查, 表示不匹配它, 999开头也不行
    ```

    相关文章

      网友评论

          本文标题:正则表达式: 各字符的解读

          本文链接:https://www.haomeiwen.com/subject/oqylvhtx.html