2019-04-10

基于正则表达式详解:

  • 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;

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352