java笔记31 正则表达式
2015-06-21 11:29
423 查看
1. 正则表达式
正则表达式:获取符合一定规则的字符串的方式
作用:专门用于操作字符串
特点:用一些特定的符号表示一些代码操作,简化书写
学习特殊符号的使用
好处:可以简化对字符串的复杂操作
弊端:阅读性较差
2. 具体操作功能
1、匹配
String matches方法
[abc] a、b 或 c(简单类)
某一位只能是a或者b或者c
[^abc] 任何字符,除了 a、b 或 c(否定)
某一位除去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]
示例
public static void checkNum(String qq) { String regex="[1-9]\\d*";//数字1-9,至少有一位 boolean flag=qq.matches(regex); if(flag) System.out.println(qq+"...ok"); else System.out.println(qq+"....非法"); } public static void checkTel(String tel) { /* 匹配手机号段 */ String regex="1[358]\\d{9}";//1开头,第二位是358,后面还有9位数字 boolean flag=tel.matches(regex); if(flag) System.out.println(tel+"...ok"); else System.out.println(tel+"....非法"); }}
2、切割
不能直接用“.” 点号表示任意字符
要加两个反斜杠 \\
splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠
(.)\\1
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
public class H_01RegexDemo { public static void main(String[] args) { splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠 splitDemo("derkkserqquisedooo","(.)\\1+");// \\1表示重复第一个组即按照连续字符切割 至少两个 } public static void splitDemo(String str,String reg) { //按照多个空格切割 String []arr=str.split(reg); for(String s:arr) { System.out.println(s); } }
}
结果:
C:
abc
a.txt
der
ser
3、 替换示例
public class H_04RegexReplace { public static void main(String[] args) { String str="wer34343536ininiji15201972323"; replaceAllDemo(str,"\\d{5,}","#");//至少5个数字的,用#替换 replaceAllDemo("derkkserqquisedooo","(.)\\1+","&");//重复元素用&替换 replaceAllDemo("derkkserqquisedooo","(.)\\1+","$1");//使用$符号获取组成员 去除重复元素 } public static void replaceAllDemo(String str,String reg,String newstr) { str=str.replaceAll(reg, newstr);//符合reg要求的,用newstr替换 System.out.println(str); }}
结果:
wer#ininiji#
der&ser&uised&
derkserquisedo
4、 获取功能
获取功能
将字符串中符合规格的子串取出
操作步骤
1、将正则表达式封装成对象
2、让正则表达式关联字符串
3、关联后,获取正则匹配引擎
4、通过引擎对符合规则的紫船进行操作,比如取出。
import java.util.regex.*;public class H_05RegexGet { public static void main(String[] args) { getDemo("jin tian tian qi bu cuo ming tian "); } public static void getDemo(String str) { String reg="\\b[a-zA-Z]{3}\\b";//连续3个字母 //将规则封装成对象 Pattern p=Pattern.compile(reg); //让正则对象和药作用的字符串相关联,获取匹配器对象 Matcher m=p.matcher(str); //String 中的matches方法就是调用了 Pattern和Matcher对象来完成的 //m.find();//将规则作用到字符串上,并进行判断 while(m.find()) { System.out.println(m.group()); System.out.println(m.start()+" "+m.end()); //返回子串的索引位置 } }}
结果:
jin
0 3
cuo
22 25
3. 练习:
IP地址排序
import java.util.TreeSet;public class H_06RegexTest { public static void main(String[] args) { ipDemo("192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"); } public static void ipDemo(String str) { str=str.replaceAll("(\\d+)", "00$1");//1位或多位数字,前面补0 str=str.replaceAll("0*(\\d{3})", "$1");//前面是0个或者多个0,后面3位,替换为后面三位 String [] arr=str.split(" +");//用一个或者多个空格切割 TreeSet<String> ts=new TreeSet<String>();//直接存入TreeSet集合 for(String s:arr) { ts.add(s); } for(String s:ts) { System.out.println(s.replaceAll("0*(\\d+)", "$1"));//替换成不带零的,并打印 } }
}
结果
2.2.2.2
8.109.90.30
10.10.10.10
102.49.23.13
192.68.1.254
4. 网页爬虫
需求
获取指定文档中的邮件地址
使用获取功能 Patten Matcher
import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.regex.Matcher;import java.util.regex.Pattern;public class H_08Spider{ public static void main(String[] args) throws Exception { getMail(); } public static void getMail() throws Exception { URL url=new URL("http://tieba.baidu.com/p/2901562330");//地址封装 URLConnection conn=url.openConnection();//返回一个 URLConnection 对象 //conn.getInputStream()返回从此打开的连接读取的输入流。 BufferedReader bufIn=new BufferedReader(newInputStreamReader(conn.getInputStream(),"utf-8")); String line=null; //String reg="[\\W&&[\\S]]+"; //String reg="[\u4E00-\u9FA5]+";//汉字编码范围 可以获取汉字 String reg="\\w+@\\w+(\\.\\w+)";//定义获取邮箱的正则表达式 Pattern p=Pattern.compile(reg); while((line=bufIn.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } }
}
正则表达式:获取符合一定规则的字符串的方式
作用:专门用于操作字符串
特点:用一些特定的符号表示一些代码操作,简化书写
学习特殊符号的使用
好处:可以简化对字符串的复杂操作
弊端:阅读性较差
2. 具体操作功能
1、匹配
String matches方法
[abc] a、b 或 c(简单类)
某一位只能是a或者b或者c
[^abc] 任何字符,除了 a、b 或 c(否定)
某一位除去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]
示例
public static void checkNum(String qq) { String regex="[1-9]\\d*";//数字1-9,至少有一位 boolean flag=qq.matches(regex); if(flag) System.out.println(qq+"...ok"); else System.out.println(qq+"....非法"); } public static void checkTel(String tel) { /* 匹配手机号段 */ String regex="1[358]\\d{9}";//1开头,第二位是358,后面还有9位数字 boolean flag=tel.matches(regex); if(flag) System.out.println(tel+"...ok"); else System.out.println(tel+"....非法"); }}
2、切割
不能直接用“.” 点号表示任意字符
要加两个反斜杠 \\
splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠
(.)\\1
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。
public class H_01RegexDemo { public static void main(String[] args) { splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠 splitDemo("derkkserqquisedooo","(.)\\1+");// \\1表示重复第一个组即按照连续字符切割 至少两个 } public static void splitDemo(String str,String reg) { //按照多个空格切割 String []arr=str.split(reg); for(String s:arr) { System.out.println(s); } }
}
结果:
C:
abc
a.txt
der
ser
3、 替换示例
public class H_04RegexReplace { public static void main(String[] args) { String str="wer34343536ininiji15201972323"; replaceAllDemo(str,"\\d{5,}","#");//至少5个数字的,用#替换 replaceAllDemo("derkkserqquisedooo","(.)\\1+","&");//重复元素用&替换 replaceAllDemo("derkkserqquisedooo","(.)\\1+","$1");//使用$符号获取组成员 去除重复元素 } public static void replaceAllDemo(String str,String reg,String newstr) { str=str.replaceAll(reg, newstr);//符合reg要求的,用newstr替换 System.out.println(str); }}
结果:
wer#ininiji#
der&ser&uised&
derkserquisedo
4、 获取功能
获取功能
将字符串中符合规格的子串取出
操作步骤
1、将正则表达式封装成对象
2、让正则表达式关联字符串
3、关联后,获取正则匹配引擎
4、通过引擎对符合规则的紫船进行操作,比如取出。
import java.util.regex.*;public class H_05RegexGet { public static void main(String[] args) { getDemo("jin tian tian qi bu cuo ming tian "); } public static void getDemo(String str) { String reg="\\b[a-zA-Z]{3}\\b";//连续3个字母 //将规则封装成对象 Pattern p=Pattern.compile(reg); //让正则对象和药作用的字符串相关联,获取匹配器对象 Matcher m=p.matcher(str); //String 中的matches方法就是调用了 Pattern和Matcher对象来完成的 //m.find();//将规则作用到字符串上,并进行判断 while(m.find()) { System.out.println(m.group()); System.out.println(m.start()+" "+m.end()); //返回子串的索引位置 } }}
结果:
jin
0 3
cuo
22 25
3. 练习:
IP地址排序
import java.util.TreeSet;public class H_06RegexTest { public static void main(String[] args) { ipDemo("192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"); } public static void ipDemo(String str) { str=str.replaceAll("(\\d+)", "00$1");//1位或多位数字,前面补0 str=str.replaceAll("0*(\\d{3})", "$1");//前面是0个或者多个0,后面3位,替换为后面三位 String [] arr=str.split(" +");//用一个或者多个空格切割 TreeSet<String> ts=new TreeSet<String>();//直接存入TreeSet集合 for(String s:arr) { ts.add(s); } for(String s:ts) { System.out.println(s.replaceAll("0*(\\d+)", "$1"));//替换成不带零的,并打印 } }
}
结果
2.2.2.2
8.109.90.30
10.10.10.10
102.49.23.13
192.68.1.254
4. 网页爬虫
需求
获取指定文档中的邮件地址
使用获取功能 Patten Matcher
import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.util.regex.Matcher;import java.util.regex.Pattern;public class H_08Spider{ public static void main(String[] args) throws Exception { getMail(); } public static void getMail() throws Exception { URL url=new URL("http://tieba.baidu.com/p/2901562330");//地址封装 URLConnection conn=url.openConnection();//返回一个 URLConnection 对象 //conn.getInputStream()返回从此打开的连接读取的输入流。 BufferedReader bufIn=new BufferedReader(newInputStreamReader(conn.getInputStream(),"utf-8")); String line=null; //String reg="[\\W&&[\\S]]+"; //String reg="[\u4E00-\u9FA5]+";//汉字编码范围 可以获取汉字 String reg="\\w+@\\w+(\\.\\w+)";//定义获取邮箱的正则表达式 Pattern p=Pattern.compile(reg); while((line=bufIn.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } }
}
相关文章推荐
- java程序中数据类型转换
- 重新定向输出流,实现java程序日志功能。
- java中的三种排序方法使用:选择排序,冒泡排序,sort方法排序。
- 黑马程序员-Java 字符流的使用简明
- java编程思想复用,多态,以及设计模式-复用篇
- java笔记06 数组
- java笔记07 面向对象
- java笔记08 设计模式与单例设计模式
- java笔记09 继承
- java笔记10 多态 Object类
- java笔记11 模板设计模式
- java笔记12 内部类
- java笔记13 异常
- java笔记14 包
- java笔记15 多线程1
- java笔记15 多线程2(线程通信、Lock)
- java笔记16 String类
- java笔记17 集合框架 List Set 泛型
- java笔记18 Map集合
- java笔记19 Collections和Arrays