正则表达式、爬虫

        

 

爬虫:

    public static void main(String[] args) {
        /*
         *  需求1:爬取版本号8,11,17的文本,但只要java,不要版本号
         *  需求2: 爬取 java8,java11,java17,java17
         *  需求3: 爬取 除了 java8,java11,java17,java17的java文本
         * */
        
        String s = "java呜呜呜呜呜呜呜呜呜呜Java8呜呜呜呜呜呜无无无无翁翁多若无群二所无群翁多若所若无群jAva11,阿萨飒飒啊啊" +
                "阿沙jaVa17撒大大是多少javA17,阿萨德撒上";

        //需求1:
        String regex1 = "((?i)java)(?=(8|11|17))";
        //需求2:
        String regex2 = "((?i)java)(?:(8|11|17))";

        //需求2:
        String regex3 = "((?i)java)(?!(8|11|17))";


        Pattern p = Pattern.compile(regex3);
        Matcher m = p.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
//获取正则表达式的对象
Pattern p = Pattern.compile("java\\d{0,2}");

//获取文本匹配器对象
Matcher m = p.matcher(str);

//利用循环获取
while (m.find()) {
    String s = m.group();
    System.out.println(s);
}

贪婪爬取    :在爬取数据的时候尽可能的多获取数据       +?

非贪婪爬取:在爬取数据的时候尽可能的少获取数据        *?

正则表达式的替换:

  public static void main(String[] args) {
        //public String replaceAll(String regex,String newStr)  按照正则表达式的规则进行替换
        //public String[] split(String regex)                   按照正则表达式的规则切割字符串

        /*
         * 有一段字符串:“张三三adas23d_asas4李四四afsjfak124a41王五五”
         * 要求1:把字符串中三个名字中间的字母替换为vs
         * 要求2:把字符串中的三个名字切割出来
         * */
        String s = "张三adasdasas李四afsjfaka王五";

        //需求1:
//        String s1 = s.replaceAll("[\\w&&[^_]]+", "vs");
//        System.out.println(s1);

        //需求2:
        String[] arr = s.split("[\\w&&[^_]]+");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

判断字符串格式:获取分组捕获分组

 public static void main(String[] args) {
        /*
        *   需求1:判断一个字符串的开始与结束字符是否一致,只考虑一个字符
        *   举例:a123a   b456b   17891 &abc& a123b(false)
        *   \\组号:表示把第X组的内容再拿出来用一次
        * */

        String  regex1="(.).+\\1";
        // (.)表示首字符是任意的, .  :表示中间的是任意的    + :至少出现一次    \\1:表示把第一组的数据拿出来再用一次

        System.out.println("a123a".matches(regex1));
        System.out.println("b456b".matches(regex1));
        System.out.println("&abc&".matches(regex1));
        System.out.println("a123b".matches(regex1));
        System.out.println("-----------------------------------");

        /*
        *   需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
        *   举例:abc123abc   aaa222abc   aaaxxxaaa   123645123   $#@!000xxx$#@!
        * */
        String regex2="(.+).+\\1";
        //  .+:任意的字符至少出现一
        System.out.println("abc123abc".matches(regex2));
        System.out.println("aaa222abc".matches(regex2));
        System.out.println("aaaxxxaab".matches(regex2));
        System.out.println("123645123".matches(regex2));
        System.out.println("$#@!000xxx$#@!".matches(regex2));
        System.out.println("-----------------------------------");
        /*
        *   需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部的每个字符也需一致
        *   举例:aaa123aaa   bbb456bbb   11117891111     %%666%%
        * */
        String regex3="((.)\\2*).+\\1";
        //第一个字符(.)是任意的, 把首字符看作一组
        // \\2:把首字母拿出来再次使用
        // 后面都要和第一个一样,  *:作用于2 ,表示后面重复的内容出现0次或多次
        System.out.println("aaa123aaa".matches(regex3));
        System.out.println("bbb456bbb".matches(regex3));
        System.out.println("11117891112".matches(regex3));
        System.out.println("%%666%%".matches(regex3));
    }
public static void main(String[] args) {
        /*
        *       我要要要要要学学学学学编编编程程
        *       变为:我要学编程
        * */
        String str ="我要要要要要学学学学学编编编程程";
        //需求:把重复的内容替换为 单个的
        // 要要要要要    要
        // 学学学学学   学
        // 编编编      编
        // 程程       程
        // (.) 把重复内容的第一个字符看做一组
        // \\1 表示第一个字符再次出现
        // +  至少一次
        // &1 把正则表达式中第一组的内容,再拿出来用
        String result = str.replaceAll("(.)\\1+", "$1");
        System.out.println(result);
    }

 非捕获分组:分组之后不需要使用本组数据,仅仅是把数据括起来。(?:)、(?=)、(?!)

特点:不占用组号

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值