关于正则表达式¶
约 1135 个字 预计阅读时间 4 分钟
介绍¶
正则表达式是一个具有特殊规则的字符串,一般用于校验输入的数据,例如电话号码,QQ号等
在String
类中,有一个方法可以判断字符串是否匹配参数的正则表达式:boolean matches(String regex)
Note
一般可以使用网站生成对应的正则表达式,例如:正则表达式生成
基本语法¶
正则表达式的基本语法如下:
基本匹配:
.
:匹配除换行符以外的任意单个字符[...]
:字符集,[]
表示一个区间,范围可以自己定义。表示匹配方括号中任意一个字符。例如[abc]
匹配"a"、"b"或"c"[^...]
:否定字符集,匹配任何不在方括号中的字符。例如[^abc]
匹配任何不是"a"、"b"或"c"的字符\d
:匹配任意数字,等同于[0-9]
\D
:匹配任意非数字字符,等同于[^0-9]
\w
:匹配任意字母、数字或下划线,等同于[a-zA-Z0-9_]
\W
:匹配任意非字母、数字或下划线字符,等同于[^a-zA-Z0-9_]
\s
:匹配任意空白字符,包括空格、制表符、换行符等\S
:匹配任意非空白字符\n
:匹配换行符\r
:匹配回车符\t
:匹配制表符\b
:匹配单词边界\B
:匹配非单词边界^
:匹配字符串的开头$
:匹配字符串的结尾
Note
字符与字符之间没有其他符号时,每一个字符之间为或的关系
每一个[]
匹配一个字符,多个[]
并列匹配多个字符
语法示例:
[abc]
:代表a
或者b
或者c
字符中的一个[^abc]
:代表除a
,b
,c
以外的任何字符[a-z]
:代表a
-z
的所有小写字符中的一个[A-Z]
:代表A
-Z
的所有大写字符中的一个[0-9]
:代表0-9之间的某一个数字字符[a-zA-Z0-9]
:代表a
-z
或者A
-Z
或者0
-9
之间的任意一个字符[a-dm-p]
:a
到d
或m
到p
之间的任意一个字符
量词 (Quantifiers):
*
:匹配前面的元素零次或多次。例如a*
匹配零个或多个"a"+
:匹配前面的元素一次或多次。例如a+
匹配一个或多个"a"?
:匹配前面的元素零次或一次。例如a?
匹配零个或一个"a"{n}
:匹配前面的元素恰好n次。例如a{3}
匹配"aaa"{n,}
:匹配前面的元素至少n次。例如a{2,}
匹配两个或更多"a"{n,m}
:匹配前面的元素至少n次,但不超过m次。例如a{2,4}
匹配"aa"、"aaa" 或"aaaa"*?
,+?
,??
,{n,}?
,{n,m}?
:非贪婪量词,尽可能少地匹配
分组与捕获 (Grouping and Capturing):
(...)
:分组,将括号内的表达式视为一个整体,并捕获匹配的内容(?:...)
:非捕获分组,将括号内的表达式视为一个整体,但不捕获匹配的内容,如果内部有捕获组,则意味着不为自己创建捕获组,但内部的捕获组仍然有效\1
,\2
, ...:反向引用,匹配前面捕获组捕获到的内容
或操作 (Alternation):
|
:或操作符,匹配|
左边或右边的表达式。例如a|b
匹配"a"或"b"&&
:并且操作符,匹配同时符合&&
左侧和右侧的表达式。例如[[a]&&[^b]]
匹配有a
且没有b
Note
需要注意,使用&&
连接两个区间需要在外侧使用一对[]
包裹该部分,如果不写任何逻辑运算符
转义字符 (Escape Characters):
\
:用于转义特殊字符,使其被视为普通字符。例如\.
匹配实际的点字符"."
断言 (Assertions):
(?=...)
:正向先行断言 (Positive Lookahead),匹配后面跟着...
的位置(?!...)
:负向先行断言 (Negative Lookahead),匹配后面不跟着...
的位置(?<=...)
:正向后行断言 (Positive Lookbehind),匹配前面是...
的位置(?<!...)
:负向后行断言 (Negative Lookbehind),匹配前面不是...
的位置
模式修饰符 (Pattern Modifiers/Flags):
i
:忽略大小写 (Case-insensitive)g
:全局匹配 (Global match),查找所有匹配项,而不是在找到第一个匹配项后停止m
:多行匹配 (Multiline),使^
和$
匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾s
(或.
的dotall模式): 使.
匹配包括换行符在内的所有字符
正则表达式在不同语言中的使用¶
- Java:见Java网络编程、正则表达式、单例设计模式与Lombok
- JavaScript:见JavaScript内建对象
- C++:见C++ 11相关新特性