正则表达式基础

(转载自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()); 
   } 
  } 
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值