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

正则表达式

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.概述

1.1 概念

是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。

其实正则表达式的功能用程序也能实现,只是比较麻烦。

如请验证QQ号是否合法(要求是不能以0开头,5到15位以及不能有数字之外的字符);

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        checkQQ();
    }
    public static void checkQQ() {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入你要验证的QQ号:");
        String qq = input.next();
        int len = qq.length();
        if (len >= 5 && len <= 15) {
            if (!qq.startsWith("0")) {
                char[] arr = qq.toCharArray();
                boolean flag = true;
                for (int i = 0; i < arr.length; i++) {
                    if (!(arr[i] >= '0' && arr[i] <= '9')) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    System.out.println("QQ : " + qq + "合法!");
                } else {
                    System.out.println("出现了非法字符!");
                }
            } else {
                System.out.println("不可以0开头");
            }
        } else {
            System.out.println("长度出错!");
        }
    }
}
请输入你要验证的QQ号:
775652121
QQ : 775652121合法!

而同样的用正则表达式:

public static void checkQQ2(){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入你要验证的QQ号:");
        String qq = input.next();
        if( qq.matches("[1-9][0-9]{4,14}")){
            System.out.println("QQ:" + qq + "合法!");
        }
        else{
            System.out.println("QQ:" + qq + "非法!");
        }
    }
总的来说,正则表达式是用于指定字符串的模式。

2.Java中使用String的四种特殊方法与正则式相关。

   如下表所示:

2.1 匹配功能:

该功能实现主要通过matches()方法来实现,比如匹配手机号段只有 13xxx 15xxx 18xxxx,代码如下所示:

public static void checkTel()
{
    String tel = "16900001111";
    String telReg = "1[358]\\d{9}";
    System.out.println(tel.matches(telReg));
}

2.2 切割功能:

该功能实现主要通过spilt()方法来实现,比如实现按照多个空格来进行切割,代码如下所示:

public static void splitDemo(String str, String reg)
{
    String reg = " +";// 按照多个空格来进行切割
    String[] arr = str.split(reg);
    System.out.println(arr.length);
    for (String s : arr)
    {
        System.out.println(s);
    }
}

2.3 替换功能:

该功能实现主要通过replaceAll(String replacement)方法来实现,比如实现将字符串中的数组替换成#以及实现将重叠的字符替换成单个字母,代码实现如下所示:

class ReplaceTest
{
    public static void main(String[] args)
    {
        String str = "wer1389980000ty1234564uiod2343475f";// 将字符串中的数组替换成#。
        replaceAllDemo(str, "\\d{5,}", "#");
        String str1 = "erkktyqqquizzzzzo";// 将重叠的字符替换成单个字母。zzzz->z
        replaceAllDemo(str1, "(.)\\1+", "$1");
    }
    public static void replaceAllDemo(String str, String reg, String newStr)
    {
        str = str.replaceAll(reg, newStr);
        System.out.println(str);
    }
}

2.4 获取功能:

该功能实现主要有如下四个步骤:

1,将正则表达式封装成对象;

2,让正则对象和要操作的字符串相关联;

3,关联后,获取正则匹配引擎;

4,通过引擎对符合规则的子串进行操作,比如取出。

比如实现将字符串中长度为4的单词取出,并将其开始位置以及结束位置打印出来的代码如下所示:

public class RegexDemo2
{
    public static void main(String[] args)
    {
        getDemo();
    }
    public static void getDemo()
    {
        String str = "ming tian jiu yao fang jia le ,da jia ";
        String reg = "\\b[a-z]{4}\\b";
        // 将规则封装成对象
        Pattern p = Pattern.compile(reg);
        // 让正则对象和要作用的字符串相关联,获取匹配器对象
        Matcher m = p.matcher(str);
        while (m.find())
        {
            System.out.println(m.group());
            System.out.println(m.start() + "...." + m.end());
        }
    }
}

3.字符类

字符类是用于匹配的字符组合。通过将一些字符放入方括号“[]”中,实现一个字符类和它所包含任何字符都匹配。

如:正则表达式中[abcd]和字母a、b、c、d任何一个都匹配。

正则表达式中还包含一些具有特殊意义的字符类,它们描述了正则表达式的常用模式。正则表达式的字符类如下表。

 :使用[^….]时,如果字符“^”不是出现在第一个“[”的后面,则仍表示字符“^”的原义,关于“^”的原义在下面的指定匹配位置中会说到。

4.量词

在正则表达式中,使用量词可以控制字符或字符串出现的次数。正则表达式的量词如下表:

注:在n 与m 之间,数字与逗号间不能有空格符。

5.指定匹配位置

在使用正则表达式进行模式匹配时,需要指定某些字符出现的位置,在正则表达式中,可以通过4种方式指定匹配位置。如下表:

6.正则表达式所支持的合法字符:

7.代码实例

1)对邮件地址进行校验。

public class MailMatchTest
{
    public static void main(String[] args)
    {
        // 需要匹配的邮件数组
        String[] mails = { "kongyeeku@163.com", "kongyeeku@gmail.com", "wawa@abc.xx" };
        // 邮件匹配规则
        String mailRegEx = "\\w{3,20}@\\w+\\.(com|org|cn|net|gov)";
        // 让正则对象和要作用的字符串相关联,获取匹配器对象
        Pattern mailPattern = Pattern.compile(mailRegEx);
        Matcher matcher = null;
        // 遍历邮件数组
        for (String mail : mails)
        {
            if (matcher == null)
            {
                matcher = mailPattern.matcher(mail);
            }
            else
            {
                matcher.reset(mail);
            }
            String result = mail + (matcher.matches() ? "是" : "不是") + "一个有效的邮件地址!";
            System.out.println(result);
        }
    }
}

2)将ip地址进行地址段顺序的排序。

public class RegexTest
{
    public static void main(String[] args)
    {
        ipSort();
    }
    /*
     * 按照字符串自然顺序,只要让它们每一段都是3位即可。 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
     * 2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。
     */
    public static void ipSort()
    {
        String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
        ip = ip.replaceAll("(\\d+)", "00$1");
        System.out.println(ip);
        ip = ip.replaceAll("0*(\\d{3})", "$1");
        System.out.println(ip);
        String[] arr = ip.split(" ");
        TreeSet<String> ts = new TreeSet<String>();
        for (String s : arr)
        {
            ts.add(s);
        }
        for (String s : ts)
        {
            System.out.println(s.replaceAll("0*(\\d+)", "$1"));
        }
    }
}

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值