Java正则多字符串匹配替换

 更新时间:2013年02月20日 19:23:54   作者:  
正则表达式异常强大,一直理解不深,用的也不深,这次项目中尝试,体会到了它的强大之处。字符串查找,匹配,替换,正则无不能做,特别是灵活的运用子串匹配得到的变量值$1,$2,再进行二次处理能够达到很巧妙的效果。

Java中使用也比较简单:
1. 编译正则表达式的字面值得到对应的模式Pattern对象;

2. 创建匹配给定输入与此模式的匹配器Matcher;

3. 通过匹配器对象执行操作,匹配器对象的方法很丰富,方法之间组合使用更加强大。

复制代码 代码如下:

public static void main(String[] args) {
    //被替换关键字的的数据源
    Map<String,String> tokens = new HashMap<String,String>();
    tokens.put("cat", "Garfield");
    tokens.put("beverage", "coffee");

    //匹配类似velocity规则的字符串
    String template = "${cat} really needs some ${beverage}.";
    //生成匹配模式的正则表达式
    String patternString = "\\$\\{(" + StringUtils.join(tokens.keySet(), "|") + ")\\}";

    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(template);

    //两个方法:appendReplacement, appendTail
    StringBuffer sb = new StringBuffer();
    while(matcher.find()) {
        matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
    }
    matcher.appendTail(sb);

    //out: Garfield really needs some coffee.
    System.out.println(sb.toString());

    //对于特殊含义字符"\","$",使用Matcher.quoteReplacement消除特殊意义
    matcher.reset();
    //out: cat really needs some beverage.
    System.out.println(matcher.replaceAll("$1"));
    //out: $1 really needs some $1.
    System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1")));

    //到得邮箱的前缀名。插一句,其实验证邮箱的正则多种多样,根据自己的需求写对应的正则才是王道
    String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$";
    pattern = Pattern.compile(emailPattern);
    matcher = pattern.matcher("test@qq.com");
    //验证是否邮箱
    System.out.println(matcher.find());
    //得到@符号前的邮箱名  out: test
    System.out.println(matcher.replaceAll("$1"));

    //获得匹配值
    String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>";
    pattern = Pattern.compile("android:(name|value)=\"(.+?)\"");
    matcher = pattern.matcher(temp);
    while(matcher.find()) {
        //out: appid, joy
        System.out.println(matcher.group(2));
    }
}


一些老是忘基础


[...] 位于括号之内的任意字符

[^...] 不在括号之中的任意字符

. 除了换行符之外的任意字符,等价于[^\n]

\w 任何单字字符, 等价于[a-zA-Z0-9]

\W 任何非单字字符,等价于[^a-zA-Z0-9]

\s 任何空白符,等价于[\ t \ n \ r \ f \ v]

\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]

\d 任何数字,等价于[0-9]

\D 除了数字之外的任何字符,等价于[^0-9]

[\b] 一个退格直接量(特例)

 

{n, m} 匹配前一项至少n次,但是不能超过m次

{n, } 匹配前一项n次,或者多次

{n} 匹配前一项恰好n次

? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}

+ 匹配前一项1次或多次,等价于{1,}

* 匹配前一项0次或多次.等价于{0,}

 

| 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式

(...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用

\n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数

 

^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头

$ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾

\b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)

\B 匹配的是非词语的边界的字符


题外话


邮箱验证,以前验证邮箱,网上搜个正则装在自己程序里面就用,其实这是不对的,不同的公司对邮箱的验证格式是不一样的,比方说163和qq邮箱注册,他们要求的格式都不一样,所以搜一个正则表达式就去套所有的邮箱格式也是不对的,符合自己的需求的正则才是正确的。

相关文章

  • springboot3如何接入nacos

    springboot3如何接入nacos

    这篇文章主要介绍了springboot3接入nacos的配置方法,经过很长时间的折腾终于搞定,下面把步骤操作过程分享给大家,需要的朋友可以参考下
    2024-03-03
  • Java NIO无法绑定指定IP和端口解决方案

    Java NIO无法绑定指定IP和端口解决方案

    这篇文章主要介绍了Java NIO无法绑定指定IP和端口解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 解决Eclipse/STS中出现Resource is out of sync with the file system的异常问题

    解决Eclipse/STS中出现Resource is out of sync with the file system

    今天小编就为大家分享一篇关于解决Eclipse/STS中出现Resource is out of sync with the file system的异常问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java多线程之Balking模式介绍

    java多线程之Balking模式介绍

    大家好,本篇文章主要讲的是java多线程之Balking模式介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java中负数的绝对值竟然不一定是正数

    Java中负数的绝对值竟然不一定是正数

    这篇文章主要介绍了Java中负数的绝对值竟然不一定是正数,文中给大家提到Java 中怎么把负数转换为正数,需要的朋友可以参考下
    2021-07-07
  • Spring依赖注入的三种方式小结

    Spring依赖注入的三种方式小结

    本篇文章主要介绍了Spring依赖注入的三种方式小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring启动过程源码分析及简介

    Spring启动过程源码分析及简介

    本文是通过AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程。本文重点给大家介绍Spring启动过程源码分析及基本概念,感兴趣的朋友一起看看吧
    2021-10-10
  • MyBatis实现MySQL批量插入的示例代码

    MyBatis实现MySQL批量插入的示例代码

    本文主要介绍了MyBatis实现MySQL批量插入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java集合Set、List、Map的遍历方法

    Java集合Set、List、Map的遍历方法

    这篇文章主要介绍了Java集合Set、List、Map的遍历方法,是非常实用的遍历技巧,需要的朋友可以参考下
    2014-09-09
  • java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    java 内部类(匿名类,匿名对象,静态内部类)详解及实例

    这篇文章主要介绍了java 内部类详解及实例代码的相关资料,需要的朋友可以参考下
    2016-12-12

最新评论