登录  /  注册
首页 > Java > java教程 > 正文

Java正则多字符串匹配替换

高洛峰
发布: 2017-01-16 11:07:46
原创
1714人浏览过

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邮箱注册,他们要求的格式都不一样,所以搜一个正则表达式就去套所有的邮箱格式也是不对的,符合自己的需求的正则才是正确的。

更多Java正则多字符串匹配替换相关文章请关注PHP中文网!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号