先从工具讲起
对待正则表达式 , 应该将其看成是一门独立的语言 , 用于复杂的文本操作中提取相应规则对应的文本 , 就是通过一个规则匹配一类字符
工具使用找在线版的就可以 , 毕竟不会用它来写代码
下面讲讲语法
1. \d 匹配任一数字 (注意这里我写的是一)
2. \w 任意字母数字下划线
3. \s 匹配空格或制表符或换行符
4. . 匹配除换行符以外的任一字符
5. - 区间
6. ^ 匹配除去后接的内容之外的字符
注意 : 在Java中使用的时候 , 上述表达式都必须加上 \
转义 除了^
和-
[] 可匹配其中任一字符,如:
1.[abc@] 匹配a或b或c或@
2.[^A-F0-3] 匹配从A~F,0~3之外的字符
修饰匹配次数 , 举例说
1. \d{6} 匹配6位数字
2. \d\d{6} 匹配6位数字,再加上前面的一次
3. (\d\d){6} 前面括号内的一组重复6次
4. {m,n} 最少m次,最多n次 [贪婪模式]
5. {m,n}? 匹配3个,取下限 [非贪婪模式]
6. {m,} 最少3次 ,不设上限\
7. ? 等价于{0,1} 相当于表达式出现0或一次
8. + \d+ 数字至少出现一次
9. * 等价于{0,} 0次或任意次
定义 : 匹配字符串中符合条件的位置
1. ^ 于前面的不同,是从字符串开始的地方开始匹配
2. $ 于结束的地方开始匹配
3. \b 匹配一个单词的边界 即匹配位置的前后字符,不全是字母 如word空格
在d字母,前面是r是字母,后面的空格 ,不是字符
这里在Java中有相应的常量定义
分为单行模式(整个文本看成一个字符串) , 多行模式(每一行看成字符串) , 忽略大小写(不想解释)
1. | 表示或操作
2. () 捕获组,捕获匹配来的内容
3. 反向引用 \nnn 若有多个括号,()()(),\1表示第一个,\2表示第二个
EG: ([a-z]\1) 将内容再重复一次 (括号的匹配以左括号为准)
4. (?:exp) 非捕获组 ,匹配到的内容不保存到内存中,所以如果使用\1取不到值
预搜索是对位置的匹配
1. (?=表达式) 匹配以表达式结尾的字符
2. (?!exp) 匹配不以exp结尾的字符
3. ?<=exp 匹配以exp开头的字符
其实网上能找到现成的
电话号码
010-888999 0\d{2,3}-\d{7,9} 最少出现7次最多出现9次
13599999999 1{35789}\d{9} 第二位是35789其一,后接9位数字
邮箱
[\w\-]+@[a-zA-Z0-9]+(\.[A-Za-z]{2,3}){1,2}
[\w]+@[a-zA-Z0-9]+(\.[A-Za-z]{2,3}){1,2}
\w+([-+.]\w+)*@\w+([-.] \w+)*\.\w+([-.]\w+)*
使用到的类分别是Pattern
和Matcher
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.] \\w+)*\\.\\w+([-.]\\w+)*"); //如果是复制,Java会自动加上\
Matcher matcher = pattern.matcher("1asnfjddshbhjsdbfj 09 = [email protected] []");
if(matcher.find()) { //匹配到了
for (int i = 0; i < matcher.groupCount(); i++) {
System.out.println(matcher.group(i));
}
}else {
System.out.println("meizhaodao");
}
}