正则表达式
正则表达式
概述:
- 就是一套规则,一种匹配模式,要么匹配字符,要么匹配位置。
- 正则表达式是专门解决字符串规则匹配的工具。
- 正则表达式也是一个字符串,用来定义匹配规则。
- 参照帮助文档,在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
2String 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)的反面意思
附录
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LXY's blog!