正则表达式

概述:

  • 就是一套规则,一种匹配模式,要么匹配字符,要么匹配位置。
  • 正则表达式是专门解决字符串规则匹配的工具。
  • 正则表达式也是一个字符串,用来定义匹配规则。
  • 参照帮助文档,在Pattern类中有简单的规则定义,可以结合字符串类的方法使用。

正则表达式的匹配规则

正则表达式中明确区分大小写字母。

正则表达式速查手册

字符 描述 举例

字符类:

^ $ 代表正则的头和尾
x 代表的是字符’x’ 匹配规则为”a”,那么需要匹配的字符串内容就是”a”
*\* 代表的是反斜线字符’\‘ 匹配规则为”\“ ,那么需要匹配的字符串内容就是”\“
a|b 匹配a或b 匹配规则为”z|food”能匹配”z”或”food”。”(z|f)ood”则匹配”zood”或”food”
[abc] 代表的是字符a、b或c 匹配规则为”[abc]” ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个
[^abc] 代表的是除了a、b或c以外的任何字符 匹配规则为”[^abc]”,那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符
[a-zA-Z] 代表的是a到z或A到Z,两头的字母包括在内 匹配规则为”[a-zA-Z]”,那么需要匹配的是一个大写或者小写字母
[0-9] 代表的是0到9数字,两头的数字包括在内 匹配规则为”[0-9]”,那么需要匹配的是一个数字
[a-zA-Z_0-9] 代表的字母或者数字或者下划线(即单词字符) 匹配规则为”[a-zA-Z_0-9]”,那么需要匹配的是一个字母或者是一个数字或一个下滑线

预定义字符类:

. 代表的是任何字符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外 匹配规则为”.”,那么需要匹配的是一个任意字符。如果,就想使用.的话,使用匹配规则”\.”来实现
\d 等价于 [0-9] 代表的是0到9数字,两头的数字包括在内 匹配规则为”\d”,那么需要匹配的是一个数字
\D 等价于 [^0-9] 代表的是除了数字外的任意字符 匹配规则为”\D”,那么需要匹配的是一个非数字字符
\w 等价于 [a-zA-Z_0-9] 代表的字母或者数字或者下划线(即单词字符) 匹配规则为”\w”,那么需要匹配的是一个字母或者是一个数字或一个下滑线
\W 等价于 [^a-zA-Z_0-9] 代表的非字母并且非数字并且非下划线(即非单词字符) 匹配规则为”\W”,那么需要匹配的是一个非字母并且非数字并且非下滑线的字符
\s 等价于 [\t\v\n\r\f] 代表的是空格、水平制表符、垂直制表符、换行符、回车符、换页符(即空白符) 匹配规则为”\s”,那么需要匹配是一个空白符
\S 等价于 [^\t\v\n\r\f] 代表的是匹配非空白符 匹配规则为”\S”,那么需要匹配是一个非空白符
\b 匹配一个单词边界,也就是指单词和空格间的位置 匹配规则为”er\b”可以匹配”never”中的”er”,但不能匹配”verb”中的”er”
\B 匹配非单词边界 匹配规则为”er\B”能匹配”verb”中的”er”,但不能匹配”never”中的”er”
\f、\n、\r、\t、\v 分别对应匹配一个换页符、换行符、回车符、制表符、垂直制表符
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长 匹配规则为”\x41”匹配”A”。”\x041”则等价于”\x04&1”。正则表达式中可以使用ASCII编码
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。 匹配规则为”(.)\1”匹配两个连续的相同字符
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符 匹配规则为”\u00A9”匹配版权符号(©)

量词:

X? 等价于 {0,1} 代表的是X出现一次或一次也没有 匹配规则为”a?”,那么需要匹配的内容是一个字符a,或者一个a都没有
X* 等价于 {0,} 代表的是X出现零次或多次 匹配规则为”a*” ,那么需要匹配的内容是多个字符a,或者一个a都没有
X+ 等价于 {0,1} 代表的是X出现一次或多次 匹配规则为”a+”,那么需要匹配的内容是多个字符a,或者一个a
X{n} 代表的是X出现恰好n次 匹配规则为”a{5}”,那么需要匹配的内容是5个字符a
X{n,} 代表的是X出现至少n次 匹配规则为”a{5,}”,那么需要匹配的内容是最少有5个字符a
X{n,m} 代表的是X出现至少n次,但是不超过m次 匹配规则为”a{5,8}”,那么需要匹配的内容是有5个字符a到8个字符a之间
其他模式:
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以使用$0…$9属性 要匹配圆括号字符,请使用”\(“或\)”
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用 匹配规则为”Windows(?=95|98|NT|2000)”能匹配”Windows2000”中的”Windows”,但不能匹配”Windows3.1”中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用 匹配规则为”Windows(?!95|98|NT|2000)”能匹配”Windows3.1”中的”Windows”,但不能匹配”Windows2000”中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反 匹配规则为”(?<=95|98|NT|2000)Windows”能匹配”2000Windows”中的”Windows”,但不能匹配”3.1Windows”中的”Windows”
(?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反 匹配规则为”(?<!95|98|NT|2000)Windows”能匹配”3.1Windows”中的”Windows”,但不能匹配”2000Windows”中的”Windows”

正则表达式中需要转义的字符

  • $:匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则$也匹配'\n''\r'。要匹配$字符本身,请使用\$
  • ( ):标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(\)
  • *:匹配前面的子表达式零次或多次。要匹配*字符,请使用\*
  • +:匹配前面的子表达式一次或多次。要匹配+字符,请使用\+
  • .:匹配除换行符\n之外的任何单字符。要匹配.,请使用\.
  • [ ]:标记一个中括号表达式的开始。要匹配[ ],请使用\[\]
  • ?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配?字符,请使用\?
  • \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,'n'匹配字符'n''\n'匹配换行符。序列'\\'匹配\,而'\('则匹配(
  • ^:匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配^字符本身,请使用\^
  • { }:标记限定符表达式的开始。要匹配{ },请使用\{\}
  • |:指明两项之间的一个选择。要匹配|,请使用\|

总述一下(14个):* . ? + $ ^ [ ] ( ) { } | \

常用正则表达式

  • 汉字:^[\u4e00-\u9fa5]{0,}$
  • 用户名:/^[a-z0-9_-]{3,16}$/
  • 密码:/^[a-z0-9_-]{6,18}$/
  • 十六进制值:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/
  • 电子邮箱:/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$//^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/
  • URL:/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
  • IP地址:/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)//^(?:(?: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]?)$/
  • HTML标签:/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
  • 删除代码//注释:(?<!http:|\S)//.*$
  • Unicode编码中的汉字范围:/^[\u2E80-\u9FFF]+$/
  • 16进制颜色值(#ffbbad、#Fc01DF、#FFF、#ffE等):/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/
  • 时间(23:59):/^([01][0-9]|[2][0-3]):[0-5][0-9]$/、如果需要省略前面的0则使用/^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/
  • 日期(yyyy-mm-dd):/\^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/
  • window操作系统文件路径:/^[a-zA-Z]:\\([^\\:*<>|"?\r\n/]+\\)*([^\\:*<>|"?\r\n/]+)?$/
    • 要求匹配:
      • F:\study\javascript\regex\regular expression.pdf
      • F:\study\javascript\regex\
      • F:\study\javascript
      • F:\
    • 详细分析:
      • 整体模式是: 盘符:\文件夹\文件夹\文件夹\
      • 其中匹配F:\,需要使用[a-zA-Z]:\\,其中盘符不区分大小写,注意\字符需要转义。
      • 文件名或者文件夹名,不能包含一些特殊字符,此时我们需要排除字符组[^\\:*<>|"?\r\n/]来表示合法字符。另外不能为空名,至少有一个字符,也就是要使用量词+。因此匹配”文件夹",可用[^\\:*<>|"?\r\n/]+\\
      • 另外”文件夹",可以出现任意次。也就是([^\\:*<>|"?\r\n/]+\\)*。其中括号提供子表达式。
      • 路径的最后一部分可以是”文件夹”,没有\,因此需要添加([^\\:*<>|"?\r\n/]+)?

正则表达式的注意事项:

  • 要匹配”a”、”-“、”z”这三者中任意一个字符,不能写成[a-z],因为其表示小写字符中的任何一个字符。可以写成如下的方式:[-az]或[az-]或[a-z]。即要么放在开头,要么放在结尾,要么转义。总之不会让引擎认为是范围表示法就行了。
  • 如果要匹配任意字符怎么办?可以使用[\d\D]、[\w\W]、[\s\S]和[^]中任何的一个。
    1
    2
    String str = "123456";
    boolean flag = str.matches("[1-9][0-9]{4,14}");//判断str是否符合该正则

贪婪匹配和惰性匹配

  • 贪婪匹配:
    • /\d{2,5}/,表示数字连续出现2到5次;其是贪婪的,它会尽可能多的匹配。
  • 惰性匹配:
    • /\d{2,5}?/表示,虽然2到5次都行,当2个就够的时候,就不在往下尝试了。
  • 通过在量词后面加个问号就能实现惰性匹配,因此所有惰性匹配情形如下:
    • {m,n}?
    • {m,}?
    • ??
    • +?
    • *?
    • 对惰性匹配的记忆方式是:量词后面加个问号,问一问你知足了吗,你很贪婪吗?
  • 多选分支:|
    • 支持多个子模式任选其一
    • (p1|p2|p3),其中p1、p2和p3是子模式,用|(管道符)分隔,表示其中任何之一。

匹配位置

  • 什么是位置?
    • 位置是相邻字符之间的位置。
  • 如何匹配位置呢?
    • 共有6个锚字符:^ $ \b \B (?=p) (?!p)
    • ^(脱字符)匹配开头,在多行匹配中匹配行开头。
    • $(美元符号)匹配结尾,在多行匹配中匹配行结尾。
    • \b是单词边界,具体就是\w和\W之间的位置,也包括\w和^之间的位置,也包括\w和$之间的位置。
    • \B就是\b的反面的意思,非单词边界。例如在字符串中所有位置中,扣掉\b,剩下的都是\B的。
      • 具体说来就是\w与\w、\W与\W、^与\W,\W与$之间的位置。
    • (?=p),其中p是一个子模式,即p前面的位置。
    • 而(?!p)就是(?=p)的反面意思

附录

常用正则表达式最强整理(速查手册)