------------android培训、java培训、期待与您交流!--------------
大纲:
一、正则表达式概述
二、正则表达式的基本应用
三、正则表达式对象、匹配器对象(Pattern与Matcher)
四、正则表达式总结
五、对ip地址进行排序。
六、邮箱格式校验
七、网页爬虫
一、正则表达式概述
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
二、正则表达式的基本应用
1、匹配示例代码
需求:手机有11位数字且以13、15、18开头开头,号码不符合规则的返回false
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));
结果返回false因为第二位数字是6不在(3,5,8)之中
2、切割示例代码
(1) String[] arr = "zhangsan.lisi.wangwu".split("\\.");
System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}
返回的数组长度是3,字符串被切割成3份。
(2) String[] arr = "zhangsan lisi wan gwu".split(" +");
返回的数组长度是4,是按一个或多个空格来分割
(3) String[] arr = "c:\\abc\\a.txt".split("\\\\");
数组长度是3
(4)按照叠词切割
String[] arr = "erkktyqqquizzzzzo".split("(.)\\1+");
字符串被切割成er ty ui o
String[] arr = "erkktyqyqquizzzzzo".split("(..)\\1");
字符串被分隔成erkkt qui zo
由此可得出结论在(..)中“.”代表任意字符,()里面的字符是一组,
\\1代表和(..)一样的一组字符,\\1+代表和(..)一样的一组或多组字符。
叠词解析:
按照叠词完成切割是为了可以让规则的结果被重用,可以将规则封装成一个组。
用()完成。组的出现都有编号,从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
String[] arr = "erkktyqqyquizzzzzo".split("(.)(.)\\2"); //前一个字符任意,后两个字符一样
此字符串是按rkk、yqq、izz、zzz切割的,数组长度是5,结果是e t yqu o
3、替换示例代码
(1)String str = we5r1389980000ty1234564uiod234345675f
str = str.replaceAll(”\\d{5,}“,“#”);
str结果是we5r#ty#uiod#f
只有数字连续5个以上的才被#所替换
(2)//将叠词替换成$. 将重叠的字符替换成单个字母。zzzz->z
String str = "erkktyqqquizzzzzo";
str = str.replaceAll("(.)\\1+","$1");
str结果是erktyquizo
str = str.replaceAll("(.)(.)\\2+","$2");str结果是 ektquzo
校验QQ号示例代码:
qq号不能以0开头,是5-15位的数字
1、传统方式
String qq = "1882345a0";
int len = qq.length();
if (len >= 5 && len <= 15) {
if (!qq.startsWith("0"))// Integer.parseInt("12a");NumberFormatException
{
try {
long l = Long.parseLong(qq);
System.out.println("qq:" + l);
} catch (NumberFormatException e) {
System.out.println("出现非法字符.......");
}
char[] arr = qq.toCharArray();// 123a4
boolean flag = true;
for (int x = 0; x < arr.length; x++) {
if (!(arr[x] >= '0' && arr[x] <= '9')) {
flag = false;
break;
}
}
if (flag) {
System.out.println("qq:" + qq);
} else {
System.out.println("出现非法字符");
}
} else {
System.out.println("不可以0开头");
}
} else {
System.out.println("长度错误");
}
2、正则方式
String qq = "123a454";
String regex = "[1-9]\\d{4,14}";
boolean flag = qq.matches(regex);
if (flag)
System.out.println(qq + "...is ok");
else
System.out.println(qq + "... 不合法")
三、正则表达式对象、匹配器对象(Pattern与Matcher)
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
1、匹配器对象的简单应用
String str = "ming tian jiu yao fang jia le ,da jia。";
String reg = "[a-z]{4,}";
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
System.out.println(m.matches());
其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
以上代码就等同于str.matches(reg);
只不过被String的方法封装后,用起来较为简单。但是功能却单一。
2、获取:将字符串中的符合规则的子串取出(获取长度是4的单词)
String str = "ming tian jiu yao fang jia le ,dayu jia。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
System.out.println(b);
System.out.println(m.group());//用于获取匹配后结果。
结果是ming,\\b保证取出的是单词。
3、将长度为4的单词全部取出
String str = "ming tian jiu yao fang jia le ,dayu jia。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
结果是:
ming
0....4
tian
5....9
fang
18....22
dayu
31....35
解析:m.group()返回的是 m.find()所找到的符合规则的单词,此单词的下标
开始是m.start() 结束是 m.end()-1
四、正则表达式总结
到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/
按以上思路将下列字符串转成:我要学编程
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
/*
将已有字符串变成另一个字符串。使用 替换功能。
1,可以先将 . 去掉。
2,在将多个重复的内容变成单个内容。
*/
str = str.replaceAll("\\.+","");
System.out.println(str);
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
五、对ip地址进行排序。
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位。
String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
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(" ");
TreeSet<String> ts = new TreeSet<String>();
for(String s : arr)
{
ts.add(s);
}
for(String s : ts)
{
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
六、邮箱格式校验
String mail = "abc12@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。mail = "1@1.1";也能通过
七、网页爬虫
将一个文本里的邮箱全部提取出来
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
<span style="white-space:pre"> </span>//获取网页中的邮箱地址
public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
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 p = Pattern.compile(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}
------------android培训、java培训、期待与您交流! --------------