关于正则表达式¶
约 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相关新特性