目录
- 正则表达式
- 基础语法
- 标准字符集合
- 自定义的字符集合
- 多行、单行模式
- 高级语法
- 选择符和分组
- 反向引用
- 预搜索/零宽断言
- 例子
- 匹配邮箱
- 基础语法
正则表达式
基础语法
标准字符集合
\D 和[^\d]意思一样,就是与 \d 相反
REG | 意义 |
---|---|
\d digital | 表示 0 到 9 之间任意的一个数字 |
\w world | 表示任意一个字母或数字或下划线 ,不包含¥$%等 |
\s space | 表示包括空格、制表符、换行符等空白字符中任意一个 |
. | 可以匹配任意一个字符 |
自定义的字符集合
REG | 意义 |
---|---|
[ad# ] 方括号 | 表示匹配 a 或 d 或 # 或 空格 |
^[ad# ] | 表示除方括号以外的字符 |
[a-g] | 表示匹配 a 到 g 之间的字符,别和上面的混淆了 |
[^a-f,0-3] | 匹配除了 a - f 和 0 到 3以外的字符 |
匹配次数
REG | 意义 |
---|---|
(\d){10} | 前面的规则重复匹配了10次 |
{n,m} | 表示至少重复n次,最多重复m次 |
{n,} | 至少n次 |
? | 同{0,1} |
+ | 同{1,} |
* | 同{0,} |
多行、单行模式
- 忽略大小写:ignorecase
- 单行模式:single line 整个串作为一个模板串
多行模式:multi line 模板串分为多个行
字符边界/匹配位置
REG
意义 ^
与字符串开始的地方匹配 $
与字符串结束的地方匹配 \b
表示在边界处匹配字符,放在左右会不一样的结果
高级语法
选择符和分组
REG | 意思 | |
---|---|---|
\| | 表示‘或’的意思,匹配左边或右边 | |
() | 对正则表达式分组,更好地组织匹配 | |
(?:Expression) | 不把()组中匹配到的字符不保存到group中 |
反向引用
\nnn
反向引用|把捕获的字符分组编号,左括号为一个分组
预搜索/零宽断言
也是匹配位置
很少用的
REG | 意义 | |
---|---|---|
(\w)(?=Expression) | 匹配以Expression匹配到的字符结尾的字符 | |
(\w)(?!Expression) | 匹配不能以Expression匹配到的字符结尾的字符 | |
(\w)(?<=Expression) | 位置前面可以匹配Expression | |
(\w)(?<!Expression) | 位置后面可以Expression |
表达式 方向 说明
|GEG
|意义|
|:----|----:|----:|
|(?=xxx)
|正向预搜索(向右) 正向预搜索,判断当前位置右侧是否能匹配指定表达式 |
|(?!xxx)
| 正向预搜索(向右) 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式 |
|(?<=xxx)
| 反向预搜索,反向预搜索,判断当前位置左侧是否能够匹配指定表达式|
例子
匹配邮箱
要考虑的问题:
- 把@前面的给匹配了:(\w+)
- 匹配“.”:. (因为“.”表示任意字符,所以要转义一下才能匹配到“.”)
- 把@后面的域名给匹配了,要考虑多层域名的匹配
- 用户名和域名中的大小写
- 用户名中含有 “.”
- 并不允许用户名中出现”-“
第一版
没能匹配到用户名中有 ”.“的邮箱(\w+)@(\w+)(\.[a-zA-Z]{2,5}){1,2}
2989389@qq.com
adfj32KddkfKJAD@163.com
ajdf23AKDJFO@yahoo.com.cn
akdjf239290@guet.org
KFADJSFOAJDSFOAEJ@GUET.EDU.CN
最终版
![](https://images0.cnblogs.com/blog/582013/201312/23170854-ccd9c8305e1d43e998a0240d67cdc1f2.jpg)
这个可以匹配用户名含有“.“的邮箱
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MatchMail {
public static void main(String[] args) {
//正则表达式Pattern p = Pattern.compile("(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})");//待匹配的字符串String str = "2989389@qq.com"+ "adfj32KddkfKJAD@163.com"+ "ajdf23AKDJFO@yahoo.com.cn"+ "akdjf239290@guet.org"+ "KFADJSFOAJDSFOAEJ@GUET.EDU.CN"+"23jka32ir.323dfj@qq.com"+"23rfasdf.com.@163.qq.com";//用正则表达式去匹配字符串Matcher m = p.matcher(str);int i = 0;//如果发现,m.find()则为truewhile(m.find()){//每一组匹配到的字符都被放到了group里System.out.println(m.group(0));i++;}System.out.println(i);
}
}
###中文字符###
**[\u4e00-\u9fa5]**
***###用正则表达式取出正则表达式中括号里的数据
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901151130888-1768887603.png)
package atest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Aa {
public static void main(String args[]) throws Exception {
// 用正则表达式把字符串中的浮点数提取出来
// "\d[.]\d" 不能处理 .t3
// “\(.*?\)” 也是可以的
Pattern p = Pattern.compile("[\d]+\.[\d]+");
String u = "Mv(2.50),Tl(3.25),3.t3,3.,3..,Tr(3.26),Bk(2.16)";
Matcher m = p.matcher(u);
// 统计有多少个浮点数int i = 0;while (m.find()) {System.out.println(m.group());i++;}System.out.println(i);
}
}
###匹配IP地址###
> 1. 匹配:三个字符一个点 三个字符一个点 三个字符一个点 三个字符
> 2. IP地址<255
> 3. IP地址的数字不能以0开始,如:012.* 第一版:
```
((\d{1,3})\.){3}\d{1,3}
```
把562.264.351也匹配了,没能确定IP地址<255* 第二版(最终版)
```
(?:(?: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]?)
```
```/ *** 最简洁的IP判断正则表达式* 25[0-5] 250-255* 2[0-4]\d 200-249* [01]?\d\d? 000-199(0-9 \d)(10-99 \d\d)(100-99 1\d\d)* ($|(?!\.$)\.) 结束 或者 不以.结束的加上.* (?!^0{1,3}(\.0{1,3}){3}$) 排除 0.0.0.0 /^(?!^0{1,3}(\.0{1,3}){3}$)((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/* (?!^255(\.255){3}$) 排除 255.255.255.255*/
```###电话、手机号码##
> 固定电话7位数,包含0开头和”—”
> 移动电话11位数,以13或15开头```
(0\d{2,3}-\d{7,9})|(1[35]\d{9})
```
![](http://images2015.cnblogs.com/blog/640685/201509/640685-20150901221837544-1968355426.png)
package regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestCode {
public static void main(String[] args) {
Pattern p = Pattern.compile("(0\d{2,3}-\d{7,9})|(1[35]\d{9})");
String str = "15907877344"
+ "0774-1593849"
+ "13877477862"
+ "1555615951"
+ "6651651565151"
+ "13515a1dfa91w13"
+ "434$tfsf51asf51"
+ "8E94 WE8";
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group(0));
}
}
}
````
所用到的工具是RegexBuddy