1. 正则表达式语法
使用工具 :RegexBuddy.exe 正则匹配
1. 标准字符集合
\n: 换行符
\t: 制表符
\\ \^ \$: 需要特殊转义的
\d : 数字 0-9 任意一个数字
\D : 非数字
\w : 字母 A-Z,a-z,_ 任意一个字母或下划线
\W: 非 字母 A-Z,a-z,0-9,_
\s: 空格、制表符、换行符等空白字符其中任意一个
.: 匹配任意字符(除了换行符)
包括任何字符:[\s\S]
2. 自定义字符集合
[] 方括号,匹配反括号中任意一个字符
[abc@]: 匹配a,b,c,@ 任意一个字符, 里面是 a或b或c 的意思
[^abc]: 匹配 a,b,c 之外 任意一个字符
[a-z] : 匹配 a-z 之间 任意一个字母
[^a-f0-3]: a-f 0-3 之外的任意一个字符
注意: 正则表达式的特殊符号在[]内,除了^,-之外 都是去了 特殊含义,
比如[.] 就是表示.
3. 量词:
{n}: 表示重复 n次
{m,n}: 至少重复m次,最多重复n 次
{m,}: 表达式至少重复m次
? : 表达式 0次或者 1次 ,相当于 {0,1}
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}
+ : 表达式出现1 次,或者任意次,相当于 {1,}
* : 表达式不出现或者出现任意次,相当于{0,}
例子:\d{3,6} 表示第一个数字开头,可以出现3-6次 2333 5666 比如
贪婪模式:
\d{3,6} : 默认是 \d{3,6}! 匹配字符越多越好,比如 123456 从1开始匹配到6
非贪婪模式:
\d{3,6}: \d{3,6}? , 匹配字符越少越好, 123456从1开始只匹配 123重新开始匹配 456
4. 字符边界,匹配的是符合某一个条件的位置
^ : 与字符开始地方匹配
$ : 与字符结束地方匹配
\b: 前面 或者后面 不是 \w
匹配一个单词边界 ,匹配单词 左右 边界
5.
A|B: 匹配A 或 B
6. 对正则表达式结果进行 过滤 正则表达式断言
[a-z]+(?=\d+)
[a-z]+(?!\d+)
电话号码匹配: 0\d[2,3]-\d[7,9]
手机号码 : (1[35789]\d{9})|(0\d{2,3}-\d{7,9})
邮箱匹配:
[\w\-]+@[a-z0-9A-Z]+(\.[A-Za-z]{2,4}){1,2}
110 @ qq.com.cn
2. 正则表达式使用
2.1. 开发工具中使用:
基本开发工具支持正则表达式查找 notepad++
2.2 数据库使用:
数据库 也可以支持正则表达式 ,mysql5.5 oracle 10g
例子:select prod_name from products where prod_name REGEXP '.000'
2.3. java 程序中 正则表达式
2.3.1. 使用 正则表达式 对象 全局匹配 ,逐个匹配
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;
public class TestPartern {
@Test
public void test1(){
// 使用 正则表达式 对象 全局匹配 ,逐个匹配
Pattern p= Pattern.compile("\\d{2}");
// 创建 Matcher 对象
Matcher m= p.matcher("2998775451");
// 尝试将 整个 字符串序列 与该模式匹配
boolean yesorno= m.matches();
System.out.println(yesorno); // 匹配成功 true
while(m.find()){
/*** 逐个匹配
* 98
77
54
51
*/
System.out.println(m.group());
}
}
}
2.3.2. 分组匹配
public void test2(){
// 正则表达式 对象
Pattern p= Pattern.compile("(\\d+)(\\w+)");
// 创建 Matcher 对象
Matcher m= p.matcher("2998775451xiaoming");
// 尝试将 整个 字符串序列 与该模式匹配
// boolean yesorno= m.matches();
while(m.find()){
// 获取匹配 结果
System.out.println(m.group()); //2998775451xiaoming
System.out.println(m.group(1)); //第一组匹配内容:(\\d+) 2998775451
System.out.println(m.group(2)); //第二组匹配内容:(\\w+) xiaoming
};
// System.out.println(yesorno);
}
2.3.3 字符串 替换、 分割
// 字符串 替换、 分割
@Test
public void test3(){
// 正则表达式 对象
Pattern p= Pattern.compile("[0-9]");
// 创建 Matcher 对象
Matcher m= p.matcher("2998775451@qq.com");
// 替换 ##########@qq.com
String newStr= m.replaceAll("#");
System.out.println(newStr);
// 分割
String str="a12b12x445d";
String[] arrs= str.split("\\d+");
System.out.println(Arrays.toString(arrs));
}
2.3.4 模仿爬虫,取出图片
/**
* 模仿爬虫,取出图片
* @throws IOException
*/
@Test
public void test4() throws IOException{
URL url=new URL("https://www.baidu.com/");
StringBuilder sb=new StringBuilder();
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream()));
String temp="";
while( (temp = reader.readLine())!=null){
// System.out.println(temp);
sb.append(temp);
}
// System.out.println(sb.toString());
// Pattern p= Pattern.compile("<a.+</a>");
// Pattern p= Pattern.compile("<a[\\s\\S]+?</a>");
// <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a>
// <a[\\s\\S]+ 匹配出现 0 次或者 1 次 ,避免 超链接 连续
Pattern p= Pattern.compile("<a[\\s\\S]+?</a>");
Matcher m= p.matcher(sb.toString());
while(m.find()){
System.out.println("超链接是:"+m.group());
}
}
// 从 a 标签中取出 链接地址 正则表达式
@Test
public void test5(){
Pattern p2= Pattern.compile("href=[\\s\\S]+(.com)");
Matcher m2= p2.matcher("<a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a>");
if(m2.find()){
System.out.println(m2.group());
}
}