网络编程
本篇主要介绍的是对字符串的操作,之前我们学习的关于对字符串的校验操作过于繁琐,代码过于复杂,而且阅读性差,java为我们提供了一种简便的方法来校验字符串,那就是正则表达式,接下来看正则表达式的特点以及它的使用。
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配(matches):String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
用实例来演示matches方法的使用以及正则表达式的书写
public static void checkTel() //校验手机号必须是13*********,15*********,18********
{
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
//1表示第一位是1,[358]表示第二位是3、5、8中的其中之一,\d{9}表示后面9位是任意数字
System.out.println(tel.matches(telReg));
//用正则表达式的matches方法来判断是否匹配,返回boolean值
}
public static void demo()
{
String str = "b23a23456789";
String reg = "[a-zA-Z]\\d*";
//[a-zA-Z]表示第一位是任意字母,\d表示第二位是任意数字,*表示第二位出现0 次或者多次
boolean b= str.matches(reg);
System.out.println(b);
}
public static void checkQQ()
{
String qq = "123a454";
String regex = "[1-9]\\d{4,14}";
//[1-9]表示第一位是不为0的数字,\d{4,14}表示后面4到14位都是任意数字
boolean flag = qq.matches(regex);
if(flag)
System.out.println(qq+"...is ok");
else
System.out.println(qq+"... 不合法");
}
2,切割(split):String split();
public static void splitDemo()
{
String str = " zhangsan lisi wangqu" ;
String reg = " +"; //按照多个空格来进行切割
String[] arr = str.split(reg);
System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}
}
3,替换(replaceAll):String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
class RegexDemo
{
public static void main(String[] args)
{
String str = "wer1389980000ty1234564uid234345675f";//将字符串中的数字替换成#。
replaceAllDemo(str,"\\d{4,}","#");
String str1 = "erkktyqqquizzzzzo"; //将重叠的字符替换成单个字母。zzzz->z
replaceAllDemo(str1,"(.)\\1+","$1"); //$1表示获取第一组的内容
}
public static void replaceAllDemo(String str,String reg,String newStr)
{
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
另外单独介绍正则表达式的另一个功能
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
这一步我们就要考虑正则表达式到底属于谁?通过查API文档看出,正则表达式属于Pattern,它是正则表达式的编译表现形式,也就是说它可以描述正则表达式进行封装。Pattern中的compile方法可以将正则进行封装。
2,让正则对象和要操作的字符串相关联。
这里我们要用到Pattern对象中的macher方法,让正则对象和要作用的字符串相关联,获得匹配器。
3,关联后,获取正则匹配引擎。
获得了匹配器引擎,我们就可以使用引擎的多种规则来获取字符串中需要的字符
4,通过引擎对符合规则的子串进行操作,比如取出。
maches:匹配一次
find:将规则作用到字符串上,并进行复核规则的字串查找
group:用于获取匹配的结果,不进行匹配查找!
//获取连续的四个字母
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "hei ma cheng xu yuan xun lian ying.wo lai le ";
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());
}
}
}
接下来较少一个关于正则的技术:网页爬虫
网页爬虫就是一个小程序,到互联网获取需要的信息,比如要获取网络上的邮箱名来发群邮件,用一个实例来演示一下爬邮箱名。
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails();
}
public static void getMails() throws Exception
{
URL url = new URL("http://127.0.0.1:8080/maiAdd/maiAdd.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn=
new BufferedReader(newInputStreamReader(conn.getInputStream()));
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mailreg);
String line = null;
while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}