------- android培训、java培训、期待与您交流! ----------
正则表达式
正则表达式是一种强大而灵活的文本处理工具。使用正则表达式我们可以对字符串进行复杂的操作。在运用中,关键是获取字符串和正则表达式相匹配的部分,只有获取了这部分,就可以
进行多种操作。
正则表达式 regex符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
常见符号
不同符号代表不同匹配规则
\\ 反斜线字符,表示一个反斜线、
[a]表示一个字符,此字符是a,还可以在中括号中添加数字。
[a-z]表示“a”到“z”之间的所有字符(包括两头)。
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)。
[^abc] 任何字符,除了 a、b 或 c(否定)。
. 任何字符(与行结束符可能匹配也可能不匹配)。
\d 数字:[0-9]。
\w 单词字符:[a-zA-Z_0-9]。
X* 数量词,表示X在字符串中出现零次或多次
X+ 一次或多次
X{n,m} 至少 n 次,但是不超过 m 次
(A)表示一个组,在字符串中确定一个组后,会索引后面的字符串,寻找相同的组,并进行预订操作。
具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
package itcast.heima; public class RegexDemo { public static void main(String[] args) { demo(); //用"."来拆分字符串,由于在正则表达式中"."代表任何字符, //所以要加上反斜线,又因为是在字符串中,故需加两根 splitDemo("zhang.dfd.wangwu","\\."); //用匹配组的字串来拆分, splitDemo("erkkyafjdlfj","(.)\\1+"); //如果字符串中有连续五个或更多数字,则将其换为"#" replaceAllDemo("dfj7778787df","\\d{5,}","#"); String str1 = "luenf ossjfljfkk jlfss"; //将叠词换为单个字符,(.)表示一个组,\\1+表示存在至少一个第一组, //$1表示第一组字符串 replaceAllDemo(str1,"(.)\\1+","$1"); } //替换 public static void replaceAllDemo(String str,String reg,String newStr){ //用newStr替代匹配reg的字符串 str = str.replaceAll(reg, newStr); System.out.println(str); } //切割 public static void splitDemo(String str,String reg){ //用匹配reg的字符串来拆分字符串,并将拆分后的字符串存入数组 String[] arr = str.split(reg); System.out.println(arr.length); for(String s:arr){ System.out.println(s); } } //匹配 public static void checkTel(){ String tel = "3453805808"; //规则:第一个元素为3,第二个元素为5或4或3,最后八个元素为数字 String telReg = "3[543]\\d{8}"; System.out.println(tel.matches(telReg)); } //匹配 public static void demo(){ String str = "808deerer"; //表示至少有一个元素,此元素可以是大小字母,也可为0-9的数字 String reg = "[a-zA-Z_0-9]+"; boolean b = str.matches(reg); System.out.println(b); } }
正则表达式的第四个功能。
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
(A)将正则表达式封装成对象。
Pattern 正则表达式的编译表示形式,就是一个正则对象。
Pattern p = Pattern.compile(reg) 将正则表达式reg封装成对象p。
(B)让正则对象和要操作的字符串相关联,获取正则匹配引擎。
Mathcer对象代表执行匹配操作的引擎。
Matcher m = p.matcher(str);让正则对象和要作用的字符串相关联。获取匹配器对象。
(C)通过引擎对符合规则的子串进行操作,比如取出。
package itcast.heima; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexDemo2 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str = "ming tian jiu yao fang jia le ,da jia。"; System.out.println(str); 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的方法封装后,用起来较为简单。但是功能却单一。 //matches方法将改变匹配索引。下面的匹配将从ming后面开始 boolean b = m.find(); //将规则作用到字符串上,并进行符合规则的子串查找。 System.out.println(b); System.out.println(m.group());//用于获取匹配后结果。 } }
正则表达式的应用:
网页爬虫
可获取网页中的符合要求的内容,下面练习中用于获取网页中的邮件地址。
/* 网页爬虫(蜘蛛) */ 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(); } 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()); } } } }