1,正则表达式:符合一定规则的表达式。作用:用于专门操作字符串。特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。好处:可以简化对字符串的复杂操作。弊端:符号定义越多,正则越长,阅读性越差。具体操作功能:
1)匹配:String matches。返回boolean型。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束。
2)切割:String split()。返回规则以外的String[]。
3)替换:String replaceAll(regex,str)。返回替换后的String。
4)获取:将字符串中的符合规则的子串取出。
匹配手机号:
String tel = "16900001111";System.out.println(tel.matches(telReg));String telReg = "1[358]\\d{9}";
按叠词切割:
String str = "erkktyqqquizzzzzo";
为了可以让规则的结果被重用可以将规则封装成一个组,用()完成,组的出现都有编号。从1开始,想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
String reg = "(.)\\1+"; String[] arr = str.split(reg);System.out.println(arr.length);for(String s : arr) {}System.out.println(s);
将重叠的字符替换成单个字母:zzzz->z
String str1 = "erkktyqqquizzzzzo";
如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。 String str = replaceAll(str1,"(.)\\1+","$1");
System.out.println(str);
2, 正则表达式的第四个功能。 获取:将字符串中的符合规则的子串取出。操作步骤:1)将正则表达式封装成对象。2)让正则对象和要操作的字符串相关联。3)关联后,获取正则匹配引擎。4)通过引擎对符合规则的子串进行操作,比如取出。import java.util.regex.*;
class RegexDemo {public static void main(String[] args) {getDemo();}public static void getDemo() {String str = "ming tian jiu yao fang jia le ,da jia。";String reg = "\\b[a-z]{4}\\b";//将规则封装成对象。Pattern p = Pattern.compile(reg);//让正则对象和要作用的字符串相关联。获取匹配器对象。Matcher m = p.matcher(str);System.out.println(m.matches());
//其实String类中的matches方法,用的就是Pattern和Matcher对象来完成的, 只不过被String的方法封装后,用起来较为简单,但是功能却单一。while(m.find()) { //将规则作用到字符串上,并进行符合规则的子串查找。System.out.println(m.group()); //用于获取匹配后结果。System.out.println(m.start()+"...."+m.end()); //单词所在的位置。
}
}
}
3, 排序ip地址。
192.68.1.254
102.49.23.13
10.10.10.10
2.2.2.2
8.109.90.30还按照字符串自然顺序,只要让它们每一段都是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.replaceAll("(\\d+)","00$1"); //每个字段的前面都补两个零System.out.println(ip);ip = ip.replaceAll("0*(\\d{3})","$1"); //每个字段只保留后3位System.out.println(ip);String[] arr = ip.split(" "); //按空格切割字符串。TreeSet<String> ts = new TreeSet<String>(); //切割后的字符串存入有序的TreeSet集合。for(String s : arr) {ts.add(s);
}for(String s : ts) { //遍历集合打印ip地址,且去掉前面多余的0,与原串保持一致。System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
4,匹配邮件。String mail = "abc12@sina.com";String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"; / /较为精确的匹配。reg = "\\w+@\\w+(\\.\\w+)+"; //相对不太精确的匹配。//mail.indexOf("@")!=-1 // mail = "1@1.1"也可匹配成功。System.out.println(mail.matches(reg));
5,网页爬虫(蜘蛛)。
import java.io.*;import java.util.regex.*;import java.net.*;class RegexTest {public static void main(String[] args) throws Exception {getMails_1();getMails();}
//抓取网页中的邮件地址。
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());}}}
//获取指定文档中的邮件地址。
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());}}}}