Java正则表达式
笔记:
正则表达式的三个作用:
1、用来进行字符串的匹配
2、用来进行替换操作
3、用来提取信息
网络爬虫:
通过超链接获取所有匹配的信息。使用递归完成。正则提取信息。
正则表达式基础:
String的match方法,replace中的使用。
java.util.regex类
Pattern中最基础的正则表达式:
.表示任意字符
\d表示任意数字
\s表示任意空白字符,比如\t,\r
\w表示任意常规字符 a-z,A-Z,0-9,_
\D表示任意非数组
\S表示任意非空格
\W表示任意非常规字符
^在中括号内表示取反。[^\d]表示非数子
[abc]表示匹配a或者b或者c
[a-d]表示匹配a-d之间的字符,也就是a,b,c,c之间的一个
也支持&&和||
基于数量的匹配:
?,*,+
*表示任意多个字符(0个或者多个)
+表示一个或多个
?表示0个或者一个
{n}精确出现n次
{n,}至少出现n次
{n,m}至少出现n次,最多出现m次
边界匹配
^在[]里面表示非,否则表示以什么开头
$表示以什么结尾
Pattern和Matcher的使用:
通过构造得到Pattern对象,通过Pattern对象和目标对象得到Matcher对象,matcher对象有大量方法对它进行处理
Matcher matcher=pattern.matcher("目标字符串");
matcher对象的方法进行操作:
matches():判断是否匹配
find():是否有匹配的对象,如果有,返回true。
group():返回上一个匹配的对象,必须先执行find()才可以group。
reset():重置指针
start():匹配的开始下标
end():匹配的结束下标
替换:
String的replaceAll等方法
提取信息:
正则表达式使用()进行分组,组数十根据左边括号划分的,第一个左括号包括的范围为第一个分组的内容
使用group(xxx)提取符合条件信息中的指定分组的内容,默认是取读所有信息
默认的是贪婪模式:也就是匹配允许的情况下,一次匹配尽量匹配更多的字符,非贪婪模式与之相反。
?加在+或者*后面表示非贪婪模式
例子:
package com.t_07; public class TestReg01 { public static void main(String[] args) { //.表示任意字符 System.out.println("a".matches(".")); //正则表达式进行的是字符的匹配而不是字符串 System.out.println("aa".matches(".")); System.out.println("\\d"); //\\d表示是否是数字,\\D表示非数字 System.out.println("123".matches("\\d\\d\\d")); System.out.println("1d23e".matches("\\d\\D\\d\\d\\D")); //\\s表示是否是空白字符,直接写的d表示d这个字符 System.out.println("1 2 d".matches("\\d\\s\\d\\s\\sd")); //\\w表示常用输入字符:a-z,A-Z,0-9,_ System.out.println("aa b1 22".matches("\\w\\w\\s\\w\\w\\s\\w\\w")); //[abcd]表示是否是abcd这四个字符中的某一个 System.out.println("a".matches("[abcd]")); //[a-z]表示是否是在a-z之间的字符 System.out.println("D".matches("[a-zA-D]")); //[^a-z]表示不在a-z之间,^一般用在中括号内,非的范围应该是从符号位置开始到边界符号 System.out.println("D".matches("[^a-z]")); System.out.println("D".matches("[^abc]")); System.out.println("b".matches("[^abc]")); System.out.println("abc".matches("a^cc")); System.out.println("a".matches("[ca^c]")); System.out.println("abc".matches("a[^c]c")); //&&和||也可以使用 System.out.println("a".matches("[a-z&&[cef]]")); System.out.println("a".matches("[a-z]||[cef]")); } }
package com.t_07; public class TestReg02 { public static void main(String[] args) { //*表示任意多个字符,(0个或多个) System.out.println("".matches("a*")); System.out.println("aaa".matches("a*")); //+表示一个或多个 System.out.println("".matches("a+")); System.out.println("a".matches("a+")); System.out.println("aaa".matches("a+")); //?表示0个或者1个 System.out.println("".matches("a?")); System.out.println("a".matches("a?")); System.out.println("aaa".matches("a?")); //{n}表示出现n次,{n,}表示至少出现n次,{n,m}表示至少出现n次,至多出现m次 System.out.println("2kk-3-12-22".matches("2?\\w+-\\d+-\\d{1,2}-{1}\\d{1,}")); System.out.println(isPhone("0087-2233445-01")); //IP System.out.println("192.168.1.255".matches("(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])\\.(\\d{1,2}||1\\d{2}||2[0-4]\\d||25[0-5])")); //身份证号 System.out.println("".matches("\\d{15}||\\d{18}||\\d{17}[X]")); } /** * 判断一个字符串是否是数字 */ public static boolean isNan(String str){ return str.matches("\\d+\\.?\\d+"); } /** * 匹配一个字符串是否是一个电话号码0870-2233445-01 */ public static boolean isPhone(String str){ return str.matches("(0087||021)-\\d{7}-\\d{2}"); } /** * 判断一个字符串是否是ip */ public static boolean isIP(String str){ //192.168.1.102 return str.matches("(1\\d\\d||2[0-4]\\d||25[0-5])\\.(1\\d\\d||2[0-4]\\d||25[0-5])\\.(1\\d\\d||2[0-4]\\d||25[0-5])"); } }
package com.t_07; public class TestReg03 { public static void main(String[] args) { System.out.println("helloworld".matches("^h\\w+")); System.out.println("h".matches("^h\\w+")); //^不在[]就表示以什么开头,特别注意:[^abc] System.out.println("helloworld".matches("\\w+d$")); } }
package com.t_07; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestReg04 { public static void main(String[] args) { //可以先将一个正则表达式编译成为一个Pattern对象,可以提高效率 Pattern p=Pattern.compile("\\d{4}"); //通过Pattern可以获取一个Matcher对象,通过Matcher对象可以获取大量的有用信息 Matcher m=p.matcher("23338888-3232-1111"); //判断是否匹配 System.out.println(m.matches());//注意,这些方法的指针都会跑的,这次跑了4个位置,可能对其他方法产生影响 //将查找的指针重置 m.reset(); //find指的是顺序匹配相应的字符串 //System.out.println(m.find()); //每进行find一次,就可以将字符串通过group获取,一定呀执行了find才能执行group,没find到 // System.out.println(m.group()); // System.out.println(m.find()); // System.out.println(m.group()); // System.out.println(m.find()); // System.out.println(m.group()); // System.out.println(m.find()); // System.out.println(m.group()); // System.out.println(m.find()); // System.out.println(m.group()); while(m.find()){ //start和end方法得到匹配字符的开始下表和结束下标 System.out.println(m.group()+",start:"+m.start()+",end:"+m.end()); } } }
package com.t_07; public class TestReg05 { public static void main(String[] args) { //第一个参数是正则表达式,第二个参数是要替换的值 String str="23444422ssdsdsgh2323jdsds"; System.out.println(str.replaceAll("\\d", "*")); System.out.println("18307006930".replaceAll("\\d{4}$","****")); } }
package com.t_07; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestReg06 { public static void main(String[] args) { String str="532101197612108712,532122199802021104,532122199700218712"; //使用括号进行分组 Pattern p=Pattern.compile("(\\d{6})(\\d{8})\\d{4}"); Pattern p1=Pattern.compile("(\\d{6}(\\d{8}))\\d{4}"); Matcher m=p.matcher(str); while(m.find()){ System.out.println("生源地:"+m.group(1)+",出生年月:"+m.group(2)); } Matcher m1=p1.matcher(str); while(m1.find()){ System.out.println(m1.group(1)+"---"+m1.group(2)); } /** * 贪婪模式 */ String str1="<tr><td>桌子</td><td>椅子</td><td>床</td></tr>"; Pattern p2=Pattern.compile("<td>(.*)</td>"); Matcher mt=p2.matcher(str1); while(mt.find()){ System.out.println(mt.group(1)); } /** * 非贪婪模式,在+或者*后面加?表示非贪婪模式 */ Pattern p3=Pattern.compile("<td>(.*?)</td>"); Matcher mt1=p3.matcher(str1); while(mt1.find()){ System.out.println(mt1.group(1)); } } }
package com.t_07; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestLink { /** * 将01.html中的所有超链接提取出来 */ public static void main(String[] args) { //getLink(readFile2String("WebRoot/01.htm")); getEmail(readFile2String("WebRoot/01.htm")); } public static String readFile2String(String path){ String str=""; try { FileInputStream input=new FileInputStream(path); byte[] buff=new byte[input.available()]; input.read(buff); str=new String(buff,"UTF-8"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return str; } public static void getLink(String str){ /** * 获取所有的超链接 */ Pattern p=Pattern.compile("<a\\s+href=\"(.*?)\""); //<a.*?\\s+href=['\"]([^\"'>]*?)['\"].*?>(.*?)</a> 下面这个是教学视频给出的 Matcher m=p.matcher(str); while(m.find()){ System.out.println(m.group(1)); } } public static void getEmail(String str){ /** * 获取所有邮箱 */ Pattern p=Pattern.compile("\\w+\\@[\\w+\\.]?\\w+\\.\\w{2,5}"); Matcher m=p.matcher(str); while(m.find()){ System.out.println(m.group()); } } }
01.html的内容自己脑补。