正则表达式:
用于操作字符串,通过一些特定的符号来体现。
数量词:
X?? | X,一次或一次也没有 |
X*? | X,零次或多次 |
X+? | X,一次或多次 |
X{n}? | X,恰好 n 次 |
X{n,}? | X,至少 n 次 |
X{n,m}? | X,至少 n 次,但是不超过 m 次 |
字符类 | |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
Possessive 数量词 | |
---|---|
X?+ | X,一次或一次也没有 |
X*+ | X,零次或多次 |
X++ | X,一次或多次 |
X{n}+ | X,恰好 n 次 |
X{n,}+ | X,至少 n 次 |
X{n,m}+ | X,至少 n 次,但是不超过 m 次 |
public class RegexDemo {
public static void main(String[] args){
/*正则表达式
* 1 匹配。
* String 类中的matches方法
* 2 切割
* String 类中的split方法
* 3 替换
* String类中的reolaceAll()方法
* 4 获取
* 将正则表达式进行对象的封装。
* Pattern p = Pattern.compile("a*b");
* 通过正则对象的matcher方法与字符串相关联,获取要对字符串操作的匹配对象Matcher
Matcher m = p.matcher("aaaaab");
通过Mather匹配器对象的方法对字符串进行操作
boolean b = m.matches();
*
* */
test_2();
}
public static void funtionDemo_4() {
String str = "da jia hao,ming tian bu fang jia";
String regex = "\\b[a-z]{3}\\b";
//1 将正则封装成对象
Pattern p = Pattern.compile(regex);
//2 通过正则对象获取匹配器对象
Matcher m =p.matcher(str);
//3 使用Matcher对象的方法对字符串进行操作。
//既然要获取三个字母组成的单词
//查找。find
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
}
}
public static void funtionDemo_3() {
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "#");
str = str.replaceAll("(.)\\1+", "$1");
String tel = "15800001111";//158****1111
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
}
public static void funtionDemo_2() {
String str = "zhangsan xiaoqiang zhaoliu";
String str1 = "zhangsan.xiaoqiang.zhouliu";
String str2 = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
String[] names2 = str2.split("(.)\\1+)");
//组:((A)(B(c))) 看左括号此例一共四个组
String[] names = str.split(" +");
String[] names1 = str1.split("\\.");
for(String name:names){
System.out.println(name);
}
}
public static void funtionDemo_1() {
//匹配手机号是否正确
String tel = "158000011110";
String regex = "1[358][0-9]{9}";//或者"1[358]\\d{9}"
boolean b = tel.matches(regex);
System.out.println(b);
}
/*1 治疗口吃:我我...我我..我我我..我要要..要要要...要学学..学学..学
*2 对ip地址排序
*3 对邮件地址效验
* */
public static void test_1(){
//1 将字符串中.去掉。用替换
String str = "我我...我我..我我我..我要要..要要要...要学学..学学..学";
str = str.replaceAll("\\.+", "");
System.out.println(str);
//2 替换叠词
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
public static void test_2(){
//192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//1 为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。
//所以,补零,按照每一位所需补充0.每一段都加两个零。
ip_str = ip_str.replaceAll("(\\d+)","00$1");
System.out.println(ip_str);
//然后每一段保留数字3位
ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
// 将ip地址切出
String[] ips = ip_str.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String ip : ips){
ts.add(ip);
}
for(String ip : ts){
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
}
public static void test_3(){
String mail = "abc1@sina.com.cn";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-z]{1,3})+";
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);
}
/*网页爬虫:其实是一个程序用于在互联网中获取符合指定规则的数据
* 爬取邮箱地址。
* */
public static List<String> PaChong() throws IOException{
//1 读取源文件
BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2 对读取的数据进行规则的匹配。从中获取符合规则的数据
String regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
String line = null;
while((line = bufr.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3 将符合规则的数据存储到集合中
list.add(m.group());
} }
return list;
}
//爬取网页
public static List<String> PaChong_1() throws IOException{
//1 读取源文件
URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//2 对读取的数据进行规则的匹配。从中获取符合规则的数据
String regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
String line = null;
while((line = bufIn.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3 将符合规则的数据存储到集合中
list.add(m.group());
}
}
return list;
}
}