(1)什么是正则表达式?
正则表达式就是符合一定规则的表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定
义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,然后用这个"规则字符串"与
你的字符串相比较看看是不是匹配。
(2)正则表达式的特点:
专门用于操作字符串的,它就是用于一些特定的符号来表示一些代码操作,可以简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
(3)正则表达式的具体操作功能:
匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
常见的有:
举个例子
/*需求:如何判断一个手机号码是否正确*/
首先定义规则:第一位只能是"1"吧,
第二位是"3,5,8"中的其中一个吧,所以第二位的规则就是[3,5,8]
第三位就是任意数字了,所以第三位的规则就是[0-9]或者是"\d"。
然后手机号一共是一位,第三位以后都是0-9,所以定义为[0-9]{9}
所以匹配手机号的规则就是:String regex = 1[3,5,8][0-9]{9};
然后拿你自定义的手机号与这个惠泽相匹配就行了 boolean b = tel.matches(regex);
(4)切割:String split();
部分代码:
class RegexDemo
{
public static void splitDemo(String str,String reg)
{
//切割之后返回一个字符串数组
String[] arr = str.split(reg);
//打印这个字符数组长度
System.out.println(arr.length);
//高级for循环遍历数组中的元素
for(String s : arr)
{
System.out.println(s);
}
}
public static void main(String[] args)
{
//在"."处切割,因为"."在正则表达式中是一个特殊符号,所以要加反义字符"\""\."代表正则里
// 面普通的一"点",但是把"\."放字符串里的话是不是应该把"\" 也给转义下,"\\"相当于"\"
splitDemo("zhangsan.lisi.wangwu","\\.");
//在正则里面”\\“相当于一个”\“,所以两个反斜杠就是”\\\\“喽
splitDemo("c:\\abc\\a.txt","\\\\");
//按照叠词完成切割。为了可以让规则的结果被重用可以将规则封装成一个组。用()完成。组
//的出现都有编号。从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取
//"\n"的意思就是重用前面第n组的的结果,因为反斜杠是”\\“所以就是"(.)\\1+"
splitDemo("erkktyqqquizzzzzo","(.)\\1+");
}
}
(5)替换 String replaceAll(regex,str);
用新字符串替换满足规则的子串如果regex中有定义组,可以在第二参
数中通过$符号获取正则表达式中的已有的组。
例如在网上发帖的时候有时候发的联系方式会被*号代替:
部分代码:
String str = "你好,我的联系方式是13000000000,QQ是123456";//将联系方式替换成*号
//数字连续出现五次以上就给屏蔽掉
String s = str.replaceAll("\\d{5,}","***");
System.out.println(s);
// 将重叠的字符替换成单个字母。zzzz->z
String str1 = "erkktyqqquizzzzzo";
replaceAllDemo(str1,"(.)\\1+","$1");//获取前面那个组"(.)"的结果
$符号可以用来获取组,"\"是用来获取本规则里面组的结果,而$是获取的是别的组里面的结果。
(6)获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
部分代码:
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "hello, da jia hao wo shi...";
System.out.println(str);
String reg = "\\b[a-z]{3}\\b";//规则找出单词为三个字母的
//将规则封装成对象。compile()是Pattern类中的静态方法返回的是Pattern对象
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成只不过被String的方
//法封装后,用起来较为简单。但是功能却单一。
System.out.println(m.matches());的。
while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。
{
System.out.println(m.group());//用于获取匹配后结果。
}
}
}
(7)需求1: 将下列字符串转成:我要学编程.
到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
public static void test_1()
{
String str = "我我...我我...我要..要要..要...学学学...学学...编编编...编程..程...程...程";
/*
将已有字符串变成另一个字符串。使用 替换功能。
1,可以先将 . 去掉。
2,在将多个重复的内容变成单个内容。
*/
str = str.replaceAll("\\.+","");//将“.”用空字符替换掉
System.out.println(str);
str = str.replaceAll("(.)\\1+","$1");//然后再用一个字替换掉原来的叠字
System.out.println(str);
}
(8)需求2:
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段顺序的排序。
还按照字符串自然顺序,只要让它们每一段都是3位即可。
1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。
public static void ipSort()
{
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
//把所有的数前都加两个零这样的话IP段是一个数的也凑成三个数了
ip = ip.replaceAll("(\\d+)","00$1");
System.out.println(ip);
//然后再把前面多余的零给抹掉每段只要三位数
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
String[] arr = ip.split(" ");//从空格处切割成String数组
//建一个集合
TreeSet<String> ts = new TreeSet<String>();
for(String s : arr)
{
ts.add(s);//把字符串数组放到set集合里,这样他自己就排序了
}
for(String s : ts)//然后再遍历集合里的元素输出的就是排序之后的了
{
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
(9)网页爬虫(蜘蛛)
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
/*
获取指定网页的邮件地址。
使用获取功能。Pattern Matcher
*/
public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
URLConnection conn = url.openConnection();//创建连接,返回的是URLConnection对象
//用URLConnection对象里的方法获取流
BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";//获取邮箱的正则表达式
Pattern p = Pattern.compile(mailreg);
while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
/*
获取指定文档中的邮件地址。
使用获取功能。Pattern Matcher
*/
public static void getMails()throws Exception
{
//创建读取流获取文档中的内容
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
//把正则表达式封装成Pattern对象
Pattern p = Pattern.compile(mailreg);
while((line=bufr.readLine())!=null)
{
//把正则表达式的对象与字符串相关联
Matcher m = p.matcher(line);
while(m.find())//用find方法找出字符串中符合规则的
{
System.out.println(m.group());//然后获取打印出来
}
}
}
}