黑马程序员技术交流社区

标题: Java总结之 正则表达式 (黑马考试) [打印本页]

作者: 狂飙的yellow.co    时间: 2013-6-1 18:53
标题: Java总结之 正则表达式 (黑马考试)
本帖最后由 狂飙的yellow.co 于 2013-6-1 19:07 编辑

正则表达式
正则表达式用于操作字符串的数据
通过一些特定的符号来实现的
所以我一定要熟记这些符号,虽然简化了许多,但是阅读性变差了。
我们用一个例子来说明正则的方便
  1. package regex;
  2. public class RegexDemo {

  3.         /**
  4.          * 要求写定义一个功能,对QQ号进行校对
  5.          * 要求长度,5-15 姿势数字,0 不能开头
  6.          *
  7.          * 正则表达式可以用于操作字符串。
  8.          * 通过一些符号来实现
  9.          */
  10.         public static void main(String[] args) {
  11.                 // TODO Auto-generated method stub
  12.                 String qq = "32345";
  13.                 checkQQ(qq);
  14.                
  15.                 dou("yelllow");
  16.         }
  17.         public static void dou(String name){
  18.                 String regex = "yel?low";//其中的? 代表的是 0 次或多次
  19.                 String regex_2 = "yel+low";// + 代表的是一次或多次
  20.                 String regex_3 = "yel{3}ow"; // {3} 代表的是l  出现的次数是3次
  21.                 String regex_4 = "yel{3,6}ow"; // {3,6}代表的是3 到6 次
复制代码
字符串常见的操作
1.匹配
         主要用到了match()这个方法
2.切割
         这个用到了split()进行切割
3.替换
         使用到了replaceAll(); z这个方法
4.获取
         将正在封装成对象
         Pattern p = Pattern.compile(“a*b”);
         通过对象的match()方法,将字节关联,获取要对字符串进行操作的匹配器对象
         Matcher m = p.matcher(“aaab”);
         通过Match 匹配器对象的方法对字符串进行操作
         boolean b = m.matches();
         下面用一个大的例子来说明
  1. package regex;

  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. public class RegexDemo_2 {

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 //匹配
  8.                 String num = "15335761939";
  9.                 checkNum(num);
  10.                
  11.                 splitDemo();//调用切割的方法
  12.                
  13.                 //替换
  14.                 replaceName();
  15.                
  16.                 //查找
  17.                 findString();
  18.         }
  19.         //1. 匹配手机号
  20.         public static void checkNum(String num){
  21.                 String regex = "1[358][0-9]{9}";
  22.                 //其中上面的还可以简写
  23.                 String regex_2 = "1[358]\\d{9}";  //其中的\\d 代表的就是 0-1
  24.                 System.out.println(num.matches(regex));
  25.                 System.out.println(num.matches(regex_2));
  26.         }
  27.         
  28.         //2.切割
  29.         
  30.         public static void splitDemo(){
  31.                 //1.分割空格 或相同的字符
  32.                 String name = "狂飙的yellowcong     黑马   黄聪";
  33.                
  34.                 String [] names = name.split(" +");  //其中这个代表的是空格 或者的多个空格的切割
  35.                
  36.                 printName(names);
  37.                
  38.                 //第二个 分割点
  39.                 String name_1 = "yellowcong.黑马.黄聪";
  40.                 String [] names_1 = name_1.split("\\."); //其中的点需要使用转义字符
  41.                 printName(names_1);
  42.                
  43.                 //切割相同的字母
  44.                 //其中这个运用到了组的概念 (A) 这个就是组 ,其中(.)代表的是任意的字符
  45.                 String name_2 = "yellowcongttttttttttttt黑马fffffffffffffff黄聪";
  46.                 //String [] names_2 = name_2.split("(.)\\1+"); //其中的点需要使用转义字符
  47.                 String [] names_2 = name_2.split("t+|f+"); //这个代表的是切 t 和数据 f
  48.                 printName(names_2);
  49.                
  50.         }
  51.         
  52.         //3.替换
  53.         public static void replaceName(){
  54.                 String name = "yellowcongttttttttttttt黑马fffffffffffffff黄聪";
  55.                
  56.                 name = name.replaceAll("t+|f+","_");
  57.                 System.out.println(name);
  58.                
  59.                 //其中这个方法经常用来使用隐藏信息
  60.                
  61.                 String num = "15335761939";
  62.                
  63.                 String regex = "(\\d{3})\\d{4}(\\d{4})";
  64.                
  65.                 num = num.replaceAll(regex, "$1****$2");//其中的$(美元符号)代表的是组
  66.                
  67.                 System.out.println(num);
  68.         }
  69.         
  70.         
  71.         //4.获取数据
  72.         public static void findString(){
  73.                 String str = "wo shi heima ";
  74.                 //1.将正则分装成对象
  75.                 String regex = "[a-z]{5}";
  76.                 Pattern p = Pattern.compile(regex);
  77.                
  78.                 //2.通过匹配器获取匹配器对象
  79.                 Matcher m = p.matcher(str);
  80.                 m.find();//使用查找的方法 find() 来获取
  81.                
  82.                 System.out.println(m.group());//获取匹配的子序列
  83.         }
  84.         
  85.         //定义方法,便于多次使用
  86.         public static void printName(String[] names) {
  87.                 for(String n :names){
  88.                         System.out.println(n);
  89.                 }
  90.         }
  91.         
  92.         

  93. }
复制代码
我拿来一个比较有用的试题,爬虫,获取Email
  1. package regex;

  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;

  8. public class Pachong {
  9.         public static void main(String[] args) throws Exception {
  10.                 // TODO Auto-generated method stub
  11.                 List<String> mails = getMails();
  12.                
  13.                 for(String m:mails){
  14.                         System.out.println(m);
  15.                 }
  16.         }
  17.         
  18.         public static List<String> getMails() throws Exception{
  19.                 //1.读取资源文件
  20.                 BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
  21.                
  22.                 //2.对读取的数据进行匹配
  23.                 String regex = "\\w+@\\w+(\\.\\w+)+";
  24.                
  25.                 List<String> list = new ArrayList<String>();
  26.         
  27.                 Pattern p = Pattern.compile(regex);
  28.                 String line = null;
  29.                 while((line = bufr.readLine())!= null){
  30.                         Matcher m = p.matcher(line);
  31.                         while(m.find()){
  32.                                 //将合适的存储
  33.                                 list.add(m.group());
  34.                         }
  35.                 }
  36.                 return list;
  37.         }
  38. }
复制代码
其中也可以用网络资源,爬取网页数据
  1. public static List<String> getMails() throws Exception{
  2.                 URL url = new URL("http://www.2345.com/");
  3.                 //1.读取资源文件
  4.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));
  5.                //由于字数的限制,后面重复的代码我不写了,希望大家理解
  6.         }
复制代码


作者: 狂飙的yellow.co    时间: 2013-6-1 19:08
嘎嘎,给自己顶一个。。。。。。。。。嘎嘎
作者: 狂飙的yellow.co    时间: 2013-6-2 06:35
额。。。。。。。。。。。。。。这个。。。。。。。。。。。。。居然没有技术分。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 皓栎    时间: 2014-2-20 21:03
不错,定下。
像222222、333333,这样的由同一个数(0到9)组成的n位整数的字符串,怎样使用正则匹配呢?





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2