现在的位置: 首页 > 综合 > 正文

<<正则表达式>>–黑马程序员

2018年09月16日 ⁄ 综合 ⁄ 共 5166字 ⁄ 字号 评论关闭

--------------ASP.Net+Android+IOS开发 
 .  .Net培训.-----期待与您交流! --------

1.  正则表达式的概述和作用。

概述:正则表达式就是专门操作的字符串的,

优点:可以减少代码。简化书写

特点:就是用些特殊的字符来表示代码,更简便。

缺点:对于复杂的正则表达式,阅读性比较差。

2.  匹配—正则表示式

       1.  方法

    利用的是String类中的matchs(String regx).

       2.  QQ号码验证

 

  

  public class QQ {
  public static void main(String[]args) {
    /**
     * 要求:第一位不能0,长度为5-15位
     */
    Stringqq = "770700715";// qq号码
    StringqqRegx = "[1-9]\\d{4,14}";// 正则表达式的判定字符串
    if (qq.matches(qqRegx))
      System.out.println("qq:" + qq + "是正确的!");
    else
      System.out.println("qq:" + qq + "是错误的!");
  }
 
}

 

        3. 邮箱验证

   

public class Email {
  public static void main(String[] args) {
    /**
     * 要求:必须有@符号,有.符号
     *     @符号前面可以是大小写,数字和下划线 (长度3-10)位
     * @符号和.之间可以是大小写和数字。(长度2-3)为最后是以com结尾
     *
     */
    String emali = "770700715@126.com";
    String emailRegx = "\\w{3,10}@[a-zA-Z0-9]{2,3}\\.com";
    if (emali.matches(emailRegx))
      System.out.println("邮箱正确");
    else
      System.out.println("邮箱错误");
  }
}


注意点:对于\w表示的是【a-zA-Z_0-9】,因为\会被转义的,所以必须要写成\\w

        同理,在字符串中要是有点(.)的话,那么要写成(\\.)

         4. 中文名字验证

   

public class Name {
  public static void main(String[] args) {
    /**
     * 要求:名字是汉字的话,那么是2-3个汉字
     *      名字要是字符的话,那么就是6-12位
     */
    String nameRegx="([\u4E00-\u9FA5]{2,3})||([A-Za-z]{6,12})";
        String name="李四";
        if(name.matches(nameRegx))
        System.out.println("名字正确");
        else
        System.out.println("名字不正确");
  }
}

3. 分割—正则表达式

        1. 分割含有转义符号的字符串

  

 public class Spit {
  public static void main(String[] args) {
    /**
     * C:\a\b\123.txt 将前面的路径按照     \ 分割
     * 因为要把其分装到字符串("C:\a\b\123.txt")中,\a会把其转义,所以必须这样写"C:\\a\\b\\123.txt"
     * 因为还要按照\分割出来也要把分割规则封装成字符串,所以要使用"\\"
     * 因为"C:\\a\\b\\123.txt"中都是两个\\所以要增加一个双\\,即"\\"
     */
      spitString("C:\\a\\b\\123.txt","\\\\");
      
  }
  public static void spitString(String str,String regex){
    String [] ss=str.split(regex);
    for(String n: ss)
      System.out.println(n);
  }
}

 

           2. 利用组来分割

组:就是把分割规则的结果还重复使用,使用()进行划分,那么就使用组,例如叠词。组还分号,从1开始分组,记忆小技巧:有几个括号就分为几个组,从左边开始数左括号,第一个左括号就是第一组,以此类推.

public class Spit {
  public static void main(String[] args) {
      /*
       * 按照叠词进行分割,那么就是使用组
       * 在正则表达式中。   .表示任意字符,(.)\1表示第二个位置的和第一个位置的相同,\1
       * 因为要封装到字符串中,\1会呗转义,所以要"(.)\\1"
       * 要是是多个相同的话,那么就"(.)\\1+"
       */
      spitString("1235ddd56ssd11de","(.)\\1+");
  }
  public static void spitString(String str,String regex){
    String [] ss=str.split(regex);
    for(String n: ss)
      System.out.println(n);
  }
}

          3.转义和组的结构图

 

 

4. 获取—正则表示式

步骤:

    1. 将正则表达式封装成对象。

    2. 将正则表达式和匹配的字符串关联起来

    3. 获取字符串的匹配器

    4. 通过匹配器引擎对字符串进行操作,例如:获取

注意:其实String类中的替换,匹配都是Pattern和Matcher综合运用,最后被String类封装了,操作就简单了,但是String类中还有没有在Matcher类中没有封装的方法,例如:获取。

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class find {
  public static void main(String[] args) {
    String str="123 56254855 452 1 56 458";//字符串
    String regex="\\b\\d{3}\\b";//表示连续三个数字
    // \\d{3}匹配规则   \b表示的单词边界
    /*将正则表达式封装成对象*/
    Pattern pat=Pattern.compile(regex);
    /*将正则表达式和字符串关联起来,获得匹配器*/
       Matcher matcher= pat.matcher(str);
       while(matcher.find()){//开始匹配
       System.out.println(matcher.group());//获取匹配的内容
       }
  }
}

注意:在获取的时候,必须先去匹配,然后再去获取,匹配的时候,要注意匹配索引的变化。(start()和 end())

5. 替代—正则表达式

   

public class Replay {
  public static void main(String[] args) {
    /**
     * 将字符串中连续两个以上的数字替换成成#号
     */
    replayDemo("123ddd6ddf41y2y1d","\\d{2,}","#");
    /**
     * 将字符串中的叠词用一个字符来替换,就用到了组,其中$1表示的是组中的第一组
     */
    replayDemo("a1113dfgkkksppd","(.)\\1+","$1");
  }
  public static void replayDemo(String str,String regex,String s){
    str=str.replaceAll(regex,s);
    System.out.println(str);
  }
}

 

6. 网页爬虫—正则表达式

就是读取 文件的内容或者是一个网上的网页内容,从其中找出你想要的内容,例如:邮箱地址,下面就是介绍获取邮箱的地址。

步骤:

1.    获取读取文件的流,

2.    获取正则表达式的匹配器

3.    然后开始读取文件,一行一行的读取,在循环读取的时候,每一行都要与匹配器匹配

4.    然后把匹配的内容读取出来后,写入到另一个文件中。

5.    最后关闭流。

     读取文件的--爬虫

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class FindEmail {
  public static void main(String[] args) throws Exception {
    File file=new File("F:\\mail.txt");
        BufferedReader buf=new BufferedReader(new FileReader(file));//读文件流
      String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
      Pattern p=Pattern.compile(regex);
      BufferedWriter writer=new BufferedWriter(new FileWriter("F:\\newMail.txt"));//写文件流
      String line=null;
      while((line=buf.readLine())!=null){//读取文件
       Matcher matcher=p.matcher(line);
       while(matcher.find()){//匹配
          /*将获取的邮箱名写到另一个文件中*/
        writer.write(matcher.group());//获取
        writer.newLine();//换行
        writer.flush();//刷新
       }
        
      }
      writer.close();
      buf.close();
  }
 
}

 

读取网上网页的上的邮箱地址--爬虫

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class FindEmaliByWangye {
  public static void main(String[] args) throws IOException {
    URL url = new URL("http://localhost:8088/android/index.jsp");
    URLConnection conn = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn
         .getInputStream()));
    String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
    Pattern p = Pattern.compile(regex);
    String line = null;
    while ((line = reader.readLine()) != null) {// 读取文件
      Matcher matcher = p.matcher(line);
      while (matcher.find()) {// 匹配
         System.out.println(matcher.group());
      }
    }
    reader.close();
  }
}
 

7. 练习---正则表达式

public class regexText {
  public static void main(String[] args) {
    /*将此字符串变成我要学编程*/
    String str = "我我我....我我我....我我我....要要要......要要要......要要要......学...学学学学...编编....程程...";
    str=str.replaceAll("\\.+", "");
    str=str.replaceAll("(.)\\1+", "$1");
        System.out.println(str);
  }
}

结果:我要学编程

---------------------- ASP.Net+Android+IOS开发 
 .  .Net培训.-----------期待与您交流! -------------------

抱歉!评论已关闭.