正则表达式:获取符合一定规则的字符串的方式
作用:专门用于操作字符串
特点:用一些特定的符号表示一些代码操作,简化书写
学习特殊符号的使用
好处:可以简化对字符串的复杂操作
弊端:阅读性较差
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());
}
}
}
}