2019-04-10

作者: DreamPath | 来源:发表于2019-04-18 18:49 被阅读0次

正则表达式:

  • 1.专门用于操作字符串的技术
  • 2.而且可以简化代码,用于对字符串进行复杂操作
  • 3.通过一些符号的形式,简化了代码的书写,其实底层还是代码
  • 弊端:符号太多,阅读性差

正则对字符串的常见功能操作

  • 1.匹配
  • 2.切割
  • 3.替换
  • 4.获取
package rejexMatches;

import java.util.Scanner;

/**
 *   1.1中括号: [判断字符位上的内容]
 *    1.2预定义字符: 都带有反斜线
 *   .  : 任意字符
 *   \d : 数字.  [0-9]
 *   \D :非数字  [^0-9]
 *   \w : 单词字符 [a-z A-Z _0-9]
 * 1.3边界字符
 *   ^ :行开头
 *   $ :行结尾
 *   \b : 单词边界
 * 1.4: 数量词:必须结合内容
 *   x? : x内容出现零次或一次
 *   x* : x内容出现零次或多次
 *   x+ : x内容出现一次或多次
 *   x{n} :x内容出现n次
 *   x{n,} : x内容至少出现n次
 *   x{n,m} : x内容出现n到m次
 */
public class Matches_demo {

    public static void main(String[] args) {

        Scanner scan=new Scanner(System.in);

while (true) {
    System.out.println("请输入您的QQ号:");
    String str = scan.nextLine();
    boolean b = str.matches("\\.+");
    if (b) {
        System.out.println(str+": 输入的QQ号合法");
        break;
    }else
    System.out.println(str + ": 输入的QQ号不和法,请重新输入");
}
    }
}

后三种操作

package split_demo;

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


public class SplitDemoString {
    public static void main(String[] args) {
        String str = "huiehf....sud###suidh..frdgggg.gt.fdd.kkkuhgu..yfdgdtf";
        /*
        1.匹配(略)
         */
        /*
        2.切割
         */
        splitss(str);

        /*
        3.替换
         */
        replaceString(str);

        /*
        4.获取
         */
        /**
         * Pattern对象的使用原理
         * 1.将正则表达式字符串编译成正则对象
         * 2.通过Pattern对象获取Matcher对象(匹配器对象)
         * 3.通过匹配器对象对字符串进行规划的匹配,结果都在匹配器当中
         * 4.通过匹配器对象的功能获取结果.
         */
        gets(str);
    }

    private static void gets(String str) {
        String sts = "di.shu.hi hd.hdd,iu ,gfu";
        String regex = "\\b[a-zA-Z]{3}\\b";

        //获取正则表达式对象
        Pattern pt = Pattern.compile(regex);
        //通过正则表达式对象获取适配器
        Matcher ms = pt.matcher(sts);

        //貌似像一个迭代器   这里是一个匹配器,如果找到匹配的就输出,不能找到就继续找下一个,直到结束索引退出循环
        while (ms.find()) {
            System.out.println(ms.start() + "----" + ms.group() + "----" + ms.end());
            System.out.println(sts.substring(ms.start(), ms.end()));
        }

    }

    private static void replaceString(String str) {
        // String replace = str.replaceAll("(.)\\1+","&&");

        //在参数列表中,其他参数使用之前的参数中规则的组,需要使用&组编号
        //将多个重叠的字符浓缩为一个字符
//       String replace = str.replaceAll("(.)\\1+","$1");

        //电话号码的隐藏,为了保证公布信息的正确性但是又维护个人信息的私密性,也就是防止被人打骚扰电话.
     /*   String ss="18569146418";
       String replace = ss.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
             System.out.println(replace);
*/
        String ssy = "aiuuf99900nsnudh8978789ynsudhy089897sd";
        //邮件网站过滤  只要出现5个以上的数字直接干掉为***  为了刻意去公布  使用了中国文字,将无法过滤信息
        ssy = ssy.replaceAll("\\d{5,}", "***");//比如:  衣二三四巴九零齐齐

        System.out.println(ssy);
    }

    private static void splitss(String str) {

       /* String[] strings = str.split("\\.+");
        for (String ss:strings) {
            System.out.println(ss);
        }*/

    /*    正则规则的复用,想复用,先封装,正则封装用()完成
        封装完成后有编号,从1开始,规则中被()封装的称之为组,直接通过编号就可以调用对应的组
        调用方式直接写已有的组的编号加上\\
        如  :  ()\\1.在使用已有的第一组内容,原则:先有组,才可以使用对应的编号调用组.*/

        String[] strings = str.split("(.)\\1+");
        for (String ss : strings) {
            System.out.println(ss);
        }
    }
}

案例二
"23.11.10.5 192.168.1.103 3.3.3.3 10.10.10.10"

要求:将这些ip地址进行排序

package example_1;

import java.util.Arrays;

/**
 * 思路:
 * 1.将ip通过空格切割
 * 2.对ip进行排序Arrays.sort(),通过字符串字典顺序进行排序,这个顺序,这个顺序是错误的
 * 原因: 每个ip有四块,每一段最多有三位,每一位不超过255
 * 应该按照位数来比较才对
 * 因此我们需要将非三位的数字转换成三位.
 * <p>
 * 措施:将每个字段都添加两个0,再取后面三位,比较后,打印时再去掉前面的零.
 */
public class Ip_demo {
    public static void main(String[] args) {
        String str = "23.11.10.5     192.168.1.103    3.3.3.3  10.10.10.10";
        //首先需要在每个字段前面添上两个零
        str = str.replaceAll("(\\d+)", "00$1");

        //获取最后每个字段后三位
        str = str.replaceAll("0*(\\d{3})", "$1");
        //使用.进行切割成字符串数组
        String[] ips = str.split(" +");
        //将每个字符串进行升序排列
        Arrays.sort(ips);
        //循环遍历,并在遍历的同时将每个字段前面的零去掉
        for (String ss : ips) {
            System.out.println(ss.replaceAll("0*(\\d+)", "$1"));
        }
    }
}

案例三:邮件校验功能
使用正则中的匹配功能

package example_1;


public class ItCast_mail {
    public static void main(String[] args) {
        /**
         * 邮件校驗
         * 使用正则表达式中的匹配
         */
        String mail = "itcast@2019itcast.cn";

        String mails = "422399419@qq.com";

        //比较笼统的校验规则
        String regex = "\\w+@\\w+(\\.\\w+)+";

        //稍微完整的校验规则
        String regex1 = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]{2,3}){1,3}";
        boolean b = mail.matches(regex);
        boolean b1 = mails.matches(regex1);

        System.out.println(mail + "---------" + b);
        System.out.println(mails + "---------" + b1);

    }
}

基于本地网页文件邮箱地址获取

package java_WangYePaChong;

import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JiYuFile {
    public static void main(String[] args) throws IOException {
        //创建文件源头
        File file = new File("D:\\Java代码\\Java进阶1\\regular01\\src\\java_WangYePaChong\\temple\\hello.html");
        //创建正则表达式源头
        String regex = "\\w+@\\w+(\\.\\w+)+";
        //返回邮箱地址集合  可存储到数据库中
        Set<String> set = fileInMail(file, regex);

        //循环遍历 后期可以存储到数据库中
        for (String ss : set) {
            System.out.println(ss);
        }

    }

    //基于文件源爬起取
    private static Set<String> fileInMail(File file, String regex) throws IOException {

        //创建存储邮箱地址的集合对象
        Set<String> set = new HashSet<>();
        //创建正则表达式对象,并将规则传入
        Pattern p = Pattern.compile(regex);


        //获取字符读取流对象
        BufferedReader buf = new BufferedReader(new FileReader(file));
        String line;
        //循环读取操作
        while ((line = buf.readLine()) != null) {
            //使用正则对象创建匹配器对象
            Matcher m = p.matcher(line);
            //如果找到符合regex的,便将符合的字符串存入到集合中
            while (m.find()) {
                set.add(m.group());
            }

        }
        //返回集合
        return set;
    }
}

获取外网的html中的邮箱地址

package java_WangYePaChong;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlWangYeHtml {
    public static void main(String[] args) throws IOException {

        String str_url = "http://www.downxia.com/zixun/48009.html";

        String regex = "\\w+@\\w+(\\.\\w+)+";

        //创建url对象
        URL url = new URL(str_url);

        //创建基于网页爬虫方法
        Set<String> set = getMail(url, regex);

        for (String ss : set) {
            System.out.println(ss);
        }
    }

    private static Set<String> getMail(URL url, String regex) throws IOException {

        URLConnection con = url.openConnection();
        Pattern p = Pattern.compile(regex);
        Set<String> set = new HashSet<>();
        BufferedReader buf = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String line;
        //循环读取操作
        while ((line = buf.readLine()) != null) {
            //使用正则对象创建匹配器对象
            Matcher m = p.matcher(line);
            //如果找到符合regex的,便将符合的字符串存入到集合中
            while (m.find()) {
                set.add(m.group());
            }

        }
        buf.close();
        return set;

    }
}

相关文章

网友评论

    本文标题:2019-04-10

    本文链接:https://www.haomeiwen.com/subject/rkuoiqtx.html