(转载自http://wenku.baidu.com/link?url=FhPUnozHMg)
正则表达式:符合一定规则的表达式,作用:用于专门操作字符串
特点:用一些特定的符号来表示一些代码操作,这样就简化了代码的书写。 所以学习正则表达式,就是在学习一些特殊符号的使用: 好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差 具体操作功能:
一、匹配:String.matches方法。用规则匹配这整个字符串,只要有一处不符合规则,就匹配结束,返回false. 二、切割:String.split方法 三、替换:String.replaceAll( )
四、获取:将字符串中的符合规则的子串取出。Pattern.compile(regex); Pattern.matcher(str);Matcher.find();Matcher.group();
一、匹配:String.matches方法。
实例1、匹配QQ号1、长度5~10位 2、不能以零开头 3、只能是数字,不能有非法数字 4、获取:将字符串中的符合规则的子串取出。 代码如下:
String qq = "12345";
//"[1-9]"代表第一位字符可以是1-9的数字,"\\d{4,9}"代表下一位是数字,且至少有4-9个数字 String qqRegex="[1-9]\\d{4,9}";
System.out.println(qq.matches(qqRegex));.
实例2、匹配电话号码:
1、手机号以13XXXXX、15XXXXX、18XXXXXX开头,都11位数 代码如下: String tel = "13a512345678";
//"[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。 String telRegex = "[1][358]\\d{9}";
System.out.println(tel.matches(telRegex));
二、字符串切割:
实例1:"zhangsan,lisi,wangwu"切成三个字符串,按" , "进行切割String str = "zhangsan,lisi,wangwu"; String reg = ",";
String[] strs = str.split(reg); for(String name: strs) { System.out.println(name);
}
实例2、
String str = "zhangsan lisi wangwu";
String reg = " +";//"+"代表空格有1位或多位
实例3、 String str = "zhangsan.lisi.wangwu";
String reg = ".";//这样切是错误的,这样一个字符串也切不出来,因为在正则表达式中“.”是一个特殊符号,有特殊的意义,它代表“任何字符”,所以要想传
达给正则表达式一个普通的“.”,则需要进行转义,用"\."也是不行的,因为这样转义完了"\"也就没有了,"\\." 这才是正确的
实例3、
str = "C:\\aa\bb\\cc.txt";
String reg = "\\\\";//按照 "//"进行切割
实例4、按照叠词进行切割,如”ekkabcffa"中的kk,ff就是叠词,也就是相同的任意连续的字符。 str = "C:\\aa\bb\\cc.txt"; str = "abcddeigkkasfe";
String reg = "(.)\\1";
说明:"."加了括号"(.)"代表是一个组,则这个组是可以进行重用的,组的出现都有编号,从1开始。想要使用已有的组可以通过 \n的形式来获取(n代表编号)。注:((())()),这里一共有多少组呢?技巧,看左括号,有几个左括号就有几组,左边开始第一个左括号就是第一组,第二个左括号就是第二组,依次类推。 实例4、 str = "abcddddefgkkkkijk";
String reg = "(.)\\1+";//"\1+"代表编号为1的组使用1次或多次
三、替换:String.replaceAll( )
实例1,假如论坛有人发贴,老发些电话号码、QQ号等广告。要求编写一个把电话号码、QQ号换成"#"号。public static String replaceAll(String str,String regex,String newStr){
str = str.replaceAll(regex, newStr); return str;
}
public static void main(String[] args) { String str = "ab1581809622adfqq122202386ase";
str = replaceAll(str,"\\d{5,}","#");//数字<=5,就替换成"#"。 System.out.println(str);
}
实例2、替换叠词
public static void replaceAll(String str,String regex,String newStr){ str = str.replaceAll(regex, newStr); System.out.println(str);
}
public static void main(String[] args) { String str = "aabcdeeeeefghiijk"; replaceAll(str, "(.)\\1", "#");
}
打印结果为:#bcd##efgh#jk
可以看到结果中的e被替换成两个#,解决方法,把正则表达式改为:"(.)\\1+" 即可
实例3、把重复的字母替换成单个字母
public static void replaceAll(String str,String regex,String newStr){ str = str.replaceAll(regex, newStr); System.out.println(str);
}
public static void main(String[] args) {
String str = "aabcdeeeeefghiijk";
replaceAll(str, "(.)\\1+", "$1");//"$"美元符号,在正则表达中是特殊特号,"$1"用于在外面获取前一个正则表达式的第一个组 }
四、获取:将字符串中的符合规则的子串取出。
操作步骤:1、将正则表达式封装成对象
2、让正则对象和要操作的字符串相关联 3、关联后,获取正则匹配引擎。
4、通过引擎对符合规则的子串进行操作,比如取出。
实例1、
public static void main(String[] args) { String str = "0122202386"; String regex = "[1-9]\\d{4,10}"; //1、将正则封装成对象p
Pattern p = Pattern.compile(regex);
//2、将字符串与p关联
Matcher m = p.matcher(str);
System.out.println(m.matches());//其实String类中的matches方法是调用Pattern和Matcher对象来完成的。
//只是被String封装后使用起来比较简单,但是功能单一。
}
实例2、
public static void main(String[] args) { String str = "ming tian jiu yao fang jie le,dai jia!"; String regex = "\\b[a-z]{3}";// "\b"转义字符:代表单词边界 //1、将正则封装成对象p
Pattern p = Pattern.compile(regex);
//2、将字符串与p关联
Matcher m = p.matcher(str);
boolean b = m.find();//尝试查找与该模式匹配的输入序列的下一个子序列。
System.out.println(b);
String getStr = m.group();//获取匹配过后符合规则的子字符串,所以要先进行find()操作 System.out.println(getStr);
}
实例3、将字符串中所有3个字母的单词取出来:
public static void main(String[] args) { String str = "ming tian jiu yao fang jie le,dai jia!"; String regex = "\\b[a-z]{3}";// "\b"转义字符:代表单词边界 //1、将正则封装成对象p
Pattern p = Pattern.compile(regex);
//2、将字符串与p关联
Matcher m = p.matcher(str);
while(m.find()){//尝试查找与该模式匹配的输入序列的下一个子序列。
String getStr = m.group();//获取匹配过后符合规则的子字符串,所以要先进行find()操作 System.out.println(getStr);
}
}
实例4、注意使用matches方法后匹配器的指针位置
public static void main(String[] args) { String str = "ming tian jiu yao fang jie le,dai jia!"; String regex = "\\b[a-z]{3}\\b"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str);
System.out.println("m.matches = " + m.matches());//输出为false
//matches方法是将整个字符串进行匹配的,当匹配后,匹配器的指针指向了索引5处就结束了,所以使用find()方法时从此处开始 while(m.find()){ String getStr = m.group();
System.out.println(getStr);
System.out.println(m.start() + "..." + m.end());//单词的开始/结束索引,这索引是包含头,不包含尾
}
}
实例5、 将下列字符串转成:我要学编程.
"我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程" 到底用四种功能中的哪一个呢?或者哪几个呢? 思路方式: 1,如果只想知道该字符是否对是错,使用匹配。 2,想要将已有的字符串变成另一个字符串,替换。 3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。 4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。 /* 将已有字符串变成另一个字符串。使用 替换功能。 1,可以先将 . 去掉。 2,在将多个重复的内容变成单个内容。 */代码如下:
public static void main(String[] args) { String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"; str = str.replaceAll("\\.+", ""); System.out.println(str);
str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str);
}
实例6、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位。
public static void main(String[] args) { 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");//每段IP前加00 System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})", "$1");//每段IP取后3位数 System.out.println(ip); String[] ips = ip.split(" "); Arrays.sort(ips);
for(String ipp: ips) {//遍历排序后的IP System.out.println(ipp); }
System.out.println("-------------------------------------------"); for(String ipp: ips) {//遍历排序后的IP
System.out.println(ipp.replaceAll("0*(\\d+)", "$1"));//把IP段前面的0删除 }
}
实例7、对邮件地址进行校验。
public static void main(String[] args) { String mail = "abc12@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。 //reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。,"/w"代表A-Za-z_0-9 //mail.indexOf("@")!=-1 //不可取
System.out.println(mail.matches(reg));
}
实例8、网页爬虫,爬email(获取email) (1)爬.txt文件
public static void main(String[] args) throws Exception { BufferedReader bufReader = new BufferedReader(new FileReader("D:\\临时文件夹\\java2\\mail.txt")); String line = null;
String regex = "\\w+@\\w+(\\.\\w+)+";
while((line=bufReader.readLine()) != null){ Pattern p = Pattern.compile(regex); Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group());
}
}
}
(2)爬网络连接
把WEB服务器打开,把资源.html文件放到服务器
public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/myweb/mail.html"); URLConnection conn = url.openConnection();
BufferedReader bufReader = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
String line = null;
String regex = "\\w+@\\w+(\\.\\w+)+"; while((line=bufReader.readLine()) != null){ Pattern p = Pattern.compile(regex); Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group());
}
}
}