java正则表达式的各种用法

package com.amx.正则表达式;

import org.junit.jupiter.api.Test;

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

/**
 * @Author: amxing
 * @Desc:
 * @Date: Created in 18:28 2018/7/28
 */
public class Demo {

    @Test
    public void invoke() {

        //判断是否为数字或者小数
        match("^\\d+$|^\\d+\\.\\d+$", "123.32");

        group("测试([0-9]+)", "dada测试1打打测试2dccada", 1);

        a();

        b();

        c();

    }

    /**
     * 进行格式匹配
     * @param regex
     * @param target
     */
    private void match(String regex, String target) {
        if (target.matches(regex)) {
            System.out.println("成功匹配");
        }
    }

    /**
     * 表达式捕获
     * @param regex
     * @param target
     * @param index
     */
    public void group(String regex, String target, int index) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(target);
        while (matcher.find()) {
            System.out.print(matcher.group(index) + "  ");
        }
    }

    /**
     * 元字符
     * \:转义字符
     * ^:匹配开始
     * $:匹配结束
     * \b:匹配字符边界
     * *:匹配前边的表达式出现0次或多次
     * +:匹配前边的表达式出现一次或多次
     * ?:匹配前边的表达式出现0次或一次
     * {n}:匹配前边的表达式出现n次,例如9{5}可以匹配99999
     * {n,}:匹配前边的表达式至少出现n次,例如9{2,},可以匹配99,9999,99999,...,等价于9*
     * {n,m}:匹配前边的表达式至少出现n次,至多出现m次,例如9{2,3}可以匹配99,999
     * {,m}:匹配前边的表达式至多出现m次
     * (?:abc):非捕获匹配
     * (?=abc):正向肯定预查
     * (?!abc):正向否定预查
     * (?<=abc):反向肯定预查
     * (?<!abc):反向否定预查
     * a|b:匹配a或者b
     * [abc]:字符集合
     * [^abc]:负字符集合,不匹配集合中的任意字符
     * \b:匹配一个单词边界
     * \B:匹配非单词边界
     */
    public void a() {
        //匹配整数或者浮点数
        if ("8.88".matches("^[0-9]+$|^[0-9]+\\.[0-9]+$")) {
            System.out.println("\n为数字");
        }
        if ("abb".matches("a{1,9}b{2}")) {
            System.out.println("匹配成功");
        }
        if ("him".matches("\\bhi\\b.*")) {
            System.out.println("匹配成功");
        } else {
            System.out.println("匹配不成功");
        }
        Pattern pattern = Pattern.compile("ab(?:c|d)");//可以匹配abc或abd,可以简化abc|abd,并且不提供缓存,后续不可以使用
        Matcher matcher = pattern.matcher("abc");
        if (matcher.find()) {
            //System.out.println(matcher.group(1));这里就不能通过group来访问了
            System.out.println("匹配成功");
        }

    }

    /**
     * 预查找,反向预查类似
     */
    public void b() {

        //正向预查,提取src
        String html = "<img src='a/b.png'/>";
        Pattern srcPattern = Pattern.compile("(?=src='([^'\"]+)')");
        Matcher srcMatcher = srcPattern.matcher(html);
        if (srcMatcher.find()) {
            System.out.println("提取的src:" + srcMatcher.group(1));
        } else{
            System.out.println("src匹配不成功");
        }
        //格式化金额字符串
        System.out.println("10000000.1".replaceAll("(\\d{1,3})(?=(\\d{3})+\\.)","$1,"));
        System.out.println("180831".replaceAll("(\\d{2})(?=(\\d{2})+)", "$1-"));

        //正向否定预查,可用来做否定匹配,常用的[^abc]可以用来匹配不包含a或b或c的其他字符,但是当我们匹配不包含abc这个字符串的时候,就要用到否定预查找了。
        Pattern noPattern = Pattern.compile("((?!abc).)*");//意思就是查找所有前边不包含abc字符串的字符
        Matcher noMatcher = noPattern.matcher("abd");
        if (noMatcher.matches()) {
            System.out.println("匹配不包含abc的字符串成功");
        } else {
            System.out.println("匹配不包含abc的字符串失败");
        }
    }

    /**
     * 贪婪匹配,懒惰匹配
     */
    public void c() {
        Pattern greedPattern = Pattern.compile("<(.*)>");//贪婪匹配
        Pattern lazyPattern = Pattern.compile("<(.*?)>");//懒惰匹配
        Matcher greedMatcher = greedPattern.matcher("<amx>>");
        Matcher lazyMatcher = lazyPattern.matcher("<amx>>");
        if (greedMatcher.find()) {
            System.out.println(greedMatcher.group(1));
        }
        if (lazyMatcher.find()) {
            System.out.println(lazyMatcher.group(1));
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值