黑马程序员------正则表达式

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

正则表达式:符合一定规则的表达式
作用:用于操作字符串
特点:用一些特定的符号来表示一些代码数据,简化书写
缺点:复杂的正则表达式阅读行极差

基本功能:
1、匹配:s.matches(regex)

2、切割:s.split(regex);
重点:如何切割 . 和 \ (反斜杠)
根据叠词切割:”abcddiujffmnpoijjsdf”

3、替换:s.replaceAll(regex,newString)
重点:”$1”获取上一个字符串中第一组的内容

4、获取:将字符串中符合的子串取出
获取步骤:
String regex =”正则表达式…”;
1、把正则表达式封装成对象
Pattern p = Pattern.compile(regex)
2、正则对象和要操作的字符串相关联
3、关联后,获取正则匹配引擎
Matcher m = p.matcher(s)
4、通过引擎对符合规则的子串进行取出
while (m.find()) {// 类似iterator,匹配则返回数据
//必须要先调用find(),否则报错
System.out.println(m.group());
}

书写规范
例:[][][]有几个中括号代表匹配几个字符(匹配3个字符)
[abc] 这个字符上只能是a、b、c中的一个
[^abc] 这个字符匹配出了abc之外的所有字符
[a-zA-Z0-9]这个字符匹配a-zA-Z0-9的字符
[a-d[m-p]]这个字符匹配a-d或者m-p
[a-z&&[def]]这个字符匹配a-z和def的交集:就是def
[a-z&&[^dc]]这个字符匹配a-z和除了dc的字符
[a-z&&[^m-p]]这个字符匹配a-z和除了m-p的字符:就是a-l和q-z

预定义字符
. 代表任意字符:在字符串中表示无意义的点 . 要:\. 来表示一个无意义的点
\d:数字[0-9]
\D:非数字[^0-9]
\s:空白字符
\S:非空白字符
\w:单词字符[a-zA-Z0-9_]又包含下划线,没有$符号
\W:非单词字符
\b:单词边界符,例如空格
\B:非单词边界
^:行开头
$:行结尾

次数代表
\d?:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或1次
\d*:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或多次(最多不限)
\d+:后面的字符跟\d条件匹配,并且后面的字符可以出现1次或多次(最少一次)
\d{n}:后面的字符跟\d条件匹配,并且后面的字符刚好出现n次
\d{n,}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多不限
\d{n,m}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多m次

字符串的所有正则方法都可以使用patten获取正则表达式对象
然后关联字符串,通过matcher来调用相关方法
String类中的matches()split()和relaceAll()底层都是调用patten和matcher来实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {

    public static void main(String[] args) {
        "// matches();// 字符串匹配"
        "// split();// 字符串切割"
        "// replace();// 替换"
        "// get();// 获取子串"
        netMethos();"// 网络爬虫"
    }

    "/**
     * 字符串匹配
     * 匹配是匹配整个字符串,当有一个字符不符合规则就立即结束,并返回false
     */"
    public static void matches() {
        "// 手机号码,13...,15...,18...,长度为11位,全部是数字"
        String phone = "1334567a910";
        String phoneRegex = "1[358]\\d{9}";
        "// qq号码,不能0开头,不能有字母,长度5-15之间"
        String qq = "124633354";
        String qqRegex = "[1-9]\\d{4,14}";
        boolean b = phone.matches(phoneRegex);
        boolean c = qq.matches(qqRegex);
        System.out.println(b);
        System.out.println(c);
    }

    "/**
     * 字符串切割
     * 切割匹配的是要切割的字符,也就是要匹配切割的条件
     * 当一个字符不满足切割条件时会继续对下一个字符进行判断,直到字符串结束
     * 
     * 叠词切割
     * (.)\\1+ :():括号内是匹配的字符,并封装成一个组,自动有编号从1开始 
     * \\1是对第一组的 内容 进行重用 ,**是匹配后的内容**
     * +:这个内容出现一次或多次
     * (a(b(c))(d)):有几个组,看左边括号  组的编号,看左边括号
     */"
    public static void split() {
        "// 叠词切割"
        String s = "好ww好学rrrr习,天fffff天ff向dddd上";
        String regex = "(.)\\1+";
        method(s, regex);
        "// 切割点 ."
        String s1 = "好..好学.....习,天...天....向...上";
        String regex1 = "\\.";
        method(s1, regex1);
        "// 切割路径"
        String s2 = "c://demo//demo.txt";
        String regex2 = "\\/\\/";
        method(s2, regex2);
    }

    public static void method(String s, String regex) {
        String[] end = s.split(regex);
        for (String t : end) {
            System.out.print(t + " ");
        }
    }

    "/**
     * 替换
     * c.replaceAll(regex1, "$1");
     * $1,是使用上一个字符串的中  组1  的内容
     * 两个字符串要在一个括号内才能使用$
     */"
    public static void replace() {
        String s = "我我我..我我我......要要要要要..要要要..编编编编编编编编编...编编....程程程程程程程程";
        String regex = "\\.";
        String c = s.replaceAll(regex, "");
        System.out.println(c);
        String regex1 = "(.)\\1+";
        String d = c.replaceAll(regex1, "$1");
        System.out.println(d);
    }

    "/**
     * 获取匹配的子串
     */"
    public static void get() {
        String s = "11112312ssssspodtdfffoooo";
        String regex = "(.)\\1{2,}";
        Pattern p = Pattern.compile(regex);"// 封装正则表达式为对象"
        Matcher m = p.matcher(s);"// 关联字符串并返回匹配引擎,操作引擎来获取数据"
        while (m.find()) {"// 类似iterator,匹配则返回数据"
            System.out.println(m.group());
        }
    }

    "/**
     * 网页爬虫
     * 
     * "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+"
     * \\w{5,15}单词最少出现5次,最多15次
     * @
     * \\w+ 出现一次或多次
     * (\\.[a-zA-z]{2,3})+
     * 对组进行重用
     */"

    public static void netMethos() {
        try {
            String regex = "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+";
            Pattern p = Pattern.compile(regex);
            URL url = new URL("http://127.0.0.1:8080/demo.txt");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    conn.getInputStream(), "UTF-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                Matcher m = p.matcher(line);"// 字符串与正则表达式进行绑定"
                while (m.find()) {"// 遍历输出"
                    System.out.println(m.group());
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值