文档章节

java*正则表达式

月生无界
 月生无界
发布于 2016/07/12 17:14
字数 2136
阅读 41
收藏 0
点赞 0
评论 0

       传送门: http://wenku.baidu.com/view/ce3cc7520066f5335b812164.html 

  1. 正则表达式的主要作用

    • 匹配输入或者获取的字符是否符合某种固定的规则格式
    • 做字符处理的时候,根据定义的规则替换掉固定要替换的字符,达到自己想要的字
  2. 正则表达式基础

    1. Java的Pattern类和Matcher

      • java.util.regex.Pattern   模式类:一个正则表达式经编译后的表现模式,用来表示一个编译过的正则表达式。
      • java.util.regex.Matcher  匹配类:用模式匹配一个字符串所表达的抽象结果。一个Matcher对象是一个状态机器,它依据Pattern对象作为匹配模式对字符串展开匹配检查。
    2. 代码例子

      • package test;
        
        import java.util.regex.Matcher;
        import java.util.regex.Pattern;
        
        public class Test {
        	
        	//正则式是最简单的能准确匹配一个给定String的模式,模式与要匹配的文本是等价的。静态的Pattern.matches方法用于比较一个String是否匹配一个给定模式
        	private static String data1 = "java";
        	public static void test1(){
        		boolean r = Pattern.matches("java", data1);
        		System.out.println(r);
        	}
        	
        	//该模式表示一个字符串必须以m开始,以n结束,中间o的次数可以出现一次或多次,()括号表示里面可匹配多个字符,+表示这个字符可出现一次或多次
        	private static String reg1 = "m(o+)n";
        	private static String[] data2 = {"moon","moooono","mon","moon","mono"};//除了数组最后一个不能匹配,其它都能
        	public static void test2(){
        		for(String arr : data2){
        			boolean r = Pattern.matches(reg1, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg1);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg1);
        			}
        		}	
        	}
        	
        	//该模式表示一个字符串必须以b开始,以n结束,中间出现[]中的任意一个字符值,则匹配,[]表示里面允许单个字符,|表示或的意思
        	private static String reg2 = "b[a|e|i|o|u]n";
        	private static String[] data3 = {"ban","ben","bin","bon","bun","byn","baen"};//数组最后两个不能匹配
        	public static void test3(){
        		for(String arr : data3){
        			boolean r = Pattern.matches(reg2, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg2);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg2);
        			}
        		}	
        	}
        	
        	//该模式表示一个字符串必须以b开始,以n结束,且中间出现()中的任一字符串,则匹配,()表示组,|表示或
        	private static String reg3 = "b(ee|ea|oo)n";
        	private static String[] data4 = {"been","bean","boon","buin","bynn"};//数组最后两个不能匹配
        	public static void test4(){
        		for(String arr : data4){
        			boolean r = Pattern.matches(reg3, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg3);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg3);
        			}
        		}	
        	}
        	
        	//\d表示数字[0-9],java中使用,在前面加上\当作转义符,表示该字符串必须是纯数组才能匹配
        	private static String reg4 = "\\d+";
        	private static String[] data5 =	{"1","10","101","1010","100+"};//数组最后一个不能匹配
        	public static void test5(){
        		for(String arr : data5){
        			boolean r = Pattern.matches(reg4, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg4);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg4);
        			}
        		}	
        	}
        	
        	//\w表示单字符[A-Z a-z 0-9],表示以单字符开始,以数字结尾的字符串
        	private static String reg5 = "\\w+\\d+";
        	private static String[] data6 = {"a100","b20","c30","df10000","gh0t"};//最后一个不匹配
        	public static void test6(){
        		for(String arr : data6){
        			boolean r = Pattern.matches(reg5, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg5);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg5);
        			}
        		}	
        	}
        	
        	//表示",","\\s"(空格),";"都能匹配,可用于截取字符串
        	private static String reg6 = "[,\\s;]";
        	private static String data7 = "薪水,职位 姓名;年龄 性别";//经过截取成字符串数组String[] str = {"薪水","职位","姓名","年龄","性别"};
        	public static void test7(){
        		String[] dataArr = data7.split(reg6);
        		for(String arr : dataArr){
        			System.out.println(arr);
        		}	
        	}
        	
        	//同上
        	private static String reg7 = "[年月日]";
        	private static String data8 =	"2016年12月11日";
        	public static void test8(){
        		Pattern p = Pattern.compile(reg7);
        		String[] dataArr = p.split(data8);
        		for(String arr : dataArr){
        			System.out.println(arr);
        		}	
        	}
        	
        	//前一个表示将字符串分组匹配,一个()表示一组,后一个表示$1表示第一组不变,第二组替换成¥
        	private static String reg8 = "(\\d+)(元|人民币|RMB)";
        	private static String reg9 = "$1¥";
        	private static String data9 = "10元 1000人民币 10000元 1000000RMB";//"结果10¥ 1000¥ 10000¥ 100000¥"
        	public static void test9(){
        		String data = data9.replaceAll(reg8, reg9);
        		System.out.println(data);
        	}
        	
        	public static void test10(){
        		Pattern p = Pattern.compile(reg1, Pattern.CASE_INSENSITIVE);
        		//用Pattern类的matcher()方法生成一个Matcher对象 
        		Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
        		StringBuffer sb = new StringBuffer();
        		// 使用find()方法查找第一个匹配的对象 
        		boolean r = m.find();
        		// 使用循环找出模式匹配的内容替换之,再将内容加到sb里 
        		while(r){
        			// appendReplacement(StringBuffer sb,String replacement) 实现非终端添加和替换步骤
        			m.appendReplacement(sb, "moon");
        			r = m.find();
        		}
        		// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
        		m.appendTail(sb);
        		System.out.println(sb.toString());
        	}
        	
        	//表示某一个字符串中间允许出现几个相同的字符{2,5}表示o可以出现2到5个都可匹配
        	private static String reg10 = "g(o{2,10})gle";
        	private static String[] data11 = {"google","gooogle","gooooogel","goooooogle","ggle"};//最后一个不匹配
        	public static void test11(){
        		for(String arr : data11){
        			boolean r = Pattern.matches(reg10, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg10);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg10);
        			}
        		}
        	}
        	
        	//" 匹配 "表示范围内,a-c表示abcde
        	static String reg11 = "T[a-e]n";
        	static String[] data12 = {"Tan","Tbn","Tcn","Ton","Twn"};
        	static void test12(){
        		for(String arr : data12){
        			boolean r = Pattern.matches(reg11, arr);
        			if(r){
        				System.out.println("成功:" + arr + " 匹配 " + reg11);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg11);
        			}
        		}
        	}
        	
        	//不区分大小写匹配
        	static String reg12 = "ab";
        	static String[] data13 = {"ab","Ab","AB"};
        	static void test13(){
        		Pattern p = Pattern.compile(reg12, Pattern.CASE_INSENSITIVE);
        		for(String arr : data13){
        			Matcher m = p.matcher(arr);
        			if(m.find()){
        				System.out.println("成功:" + arr + " 匹配 " + reg12);
        			}else{
        				System.out.println("失败:" + arr + " 匹配 " + reg12);
        			}
        		}
        	}
        	
        	//使用正则表达式劈分字符串,\\s空格,*出现0次或多次,+出现一次或多次,?出现0次或1次
        	static String reg13 = "(\\s*,\\s*)|(\\s*;\\s*)|(\\s+)";
        	static String data14 = "职务=GM 薪水=50000 ,  姓名=职业经理   性别=男 年龄=45 ";
        	static void test14(){
        		Pattern p = Pattern.compile(reg13);
        		String[] data = p.split(data14);
        		for(String arr : data){
        			System.out.println(arr);
        		}
        	}
        	
        	//解析正则表达式中的文字,\1对应第一个小括号括起来的group1
        	static String reg14 = "<(\\w+)>(\\w+)</\\1>";
        	static String data15 = "<name>Bill</name><salary>50000</salary><title>GM</title>";
        	static void test15(){
        		Pattern p = Pattern.compile(reg14);
        		Matcher m = p.matcher(data15);
        		while(m.find()){
        			System.out.println(m.group(1)+":"+m.group(2));
        		}
        	}
        	
        	//将单词数字混合的字符串的单词部分大写
        	static String reg15 = "([a-zA-Z]+[0-9]+)";
        	static String data16 = "age45 salary500000 50000 title";
        	static void test16(){
        		Pattern p = Pattern.compile(reg15);
        		Matcher m = p.matcher(data16);
        		StringBuffer sb = new StringBuffer();
        		while(m.find()){
        			String r = m.group(1).toUpperCase();
        			m.appendReplacement(sb, r);
        		}
        		m.appendTail(sb);
        		System.out.println(sb.toString());
        	}
        	
        	public static void main(String[] args) {
        //		test1();
        //		test2();
        //		test3();
        //		test4();
        //		test5();
        //		test6();
        //		test7();
        //		test8();
        //		test9();
        //		test10();
        //		test11();
        //		test12();
        //		test13();
        //		test14();
        //		test15();
        		test16();
        	} 
        }
        
  3. 正则符号列表

正则符号

名字 正则表达式 例子 注解
句点符号 t.n tan,t#n,t n 该通配符表示匹配所有单个字符,包括空格等字符,如例子,只要符合前后是t和n的字符都能匹配
方括号符号 t[aeio]n tan,ten,tin,ton 解决句点符号匹配太广泛问题,表示t与n之间只有方括号内指定的字符,才可以匹配,同时,方括号内只能匹配单个字符
“或”符号 t(a|e|i|oo)n tan,ten,tin,toon 或符合解决方括号只能匹配单个字符的问题,通过“|”来表示t与n之间能出现的所有可匹配字符,由于不能使用匹配单个字符的方括号,这里使用圆括号“()”,表示中间可以匹配多个字符
匹配次数符号
符号 次数
* 0次或者 多次
+ 1次或者多次
0次或者1次
{n} 恰好n次
{n,m} 从n次到m次

 

正则表达式 例子
  t(a*)n tn,tan,taan
t(a+)n tan,taan
[0-9]{3} \-? [0-9]{2} 159-49 或 94229
[0-9]{3} \- [0-9]{2} 479-989
[0-9]{3,5} 919,9927,97029

第一个正则表达式表示a可以出现,可以不出现,出现次数不限定

第二个表示a必须出现,出现次数不限定

第三个由于连字符“-”有特殊意义,表示一个范围,所以前面要加转义符“\”,表示“-”可出现一次或者不出现

第四个大括号里面表示出现几次,前面的[0-9]表示从1到9

第五个表示最少3位数,最多5位数

否字符 [^t]an aan,ban,... 表示第一个字符不能是t
圆括号 ([0-9]+)([a-z]+) 1q,11q,2fg,... 圆括号表示分组,一个圆括号表示一组,可匹配前部分是数字,后部分是字符的所有字符,分成两组匹配
空白符号 a\s+b a b,a  b \s表示空白符号,该正则表达式表示中间可以出现一个或者多个空白符号
常用符号
 符号  等价的正则表达式
\d [0-9]
\D [^0-9]
\w [0-9A-Za-z]
\W [^ 0-9A-Za-z ]
\s [\t\n\r\f]
\S [^\t\n\r\f]
懒得写
注释
纯数字
非数字
单字字符
非单字字符
空白(空格符、换号符、回车符、制表符)
  1. 非空白符

© 著作权归作者所有

共有 人打赏支持
月生无界
粉丝 10
博文 16
码字总数 29963
作品 0
广州
程序员
4个Java的常用工具,了解一下吧!

在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响。不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的。 关于Java的...

梦想远方_8e96 ⋅ 06/15 ⋅ 0

centos7 yum安装java运行环境,初识hadoop

安装java运行环境 1.实验机相关信息: [root@node2 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@node2 ~]# uname -r 3.10.0-327.el7.x86_6 2.配置epel源,以y......

smile68 ⋅ 04/21 ⋅ 0

编写高性能 Java 代码的最佳实践

摘要:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。以下是译...

这篇文章 ⋅ 06/20 ⋅ 0

Java反斜线(\)路径与转义字符的小坑

1.图片路径字段ImagePath, 从数据库读出,写到前台变量中, 正常(比如: uploadimage201818802-8517A000800002-1.jpg) 2.由前台向后台提交, getParameter取出则反斜线成了转义符(字符串变为: u...

javado ⋅ 06/11 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

那些提升开发人员工作效率的在线工具

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,...

bjweimengshu ⋅ 04/18 ⋅ 0

Common Gui Tools 1.4 发布,Java GUI 实用小工具集

Java GUI实用小工具集 Common Gui Tools 新增:二维码生成解析、时间戳转换、Json格式化、文本文件切分等。 Common Gui Tools 是用java编写,GUI界面的实用小工具集,1.4版有20个小工具: 1,...

bs2004 ⋅ 04/22 ⋅ 0

02、Java的lambda表达式和JavaScript的箭头函数

[toc] 前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系;本次试图通过这篇文章弄懂上面的两个“语法糖”。 简介 Lambda 表达式来源于 ...

weir_will ⋅ 06/14 ⋅ 0

Lambda 表达式有何用处?如何使用?(针对Java8)

什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的J...

亭子happy ⋅ 06/06 ⋅ 0

Spring AOP切点表达式详解

简介 面向对象编程,也称为OOP(即Object Oriented Programming)最大的优点在于能够将业务模块进行封装,从而达到功能复用的目的。通过面向对象编程,不同的模板可以相互组装,从而实现更为...

张旭峰 ⋅ 06/05 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout基于内存的DataMode 推荐引擎Demo2

Mahout基于内存的DataMode 推荐引擎Demo2 //注释的部分是基于文件也可以理解为基于日志文件的, //DataModel 可以有很多种,实现abstractDataMode的子类,原则上都可以作为数据源,个人觉得,...

xiaomin0322 ⋅ 18分钟前 ⋅ 0

Docker部署Tomcat及Web应用

一、在线下载docker yum install -y epel-releaseyum install docker-io # 安装dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务 1 ...

Jeam_ ⋅ 18分钟前 ⋅ 0

研发运营一体化能力成熟度模型

研发运营一体化是指在 IT 软件及相关服务的研发及交付过程中,将应用的需求、开发、测试、部 署和运营统一起来,基于整个组织的协作和应用架构的优化,实现敏捷开发、持续交付和应用运营的无...

stars永恒 ⋅ 23分钟前 ⋅ 0

jQuery缩小放大触发事件

jquery的resize()方法使用 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> var i = 0; $(document).ready(function(){ ......

RobertZou ⋅ 24分钟前 ⋅ 0

eclipse python 搭建

https://jingyan.baidu.com/article/9113f81b68ebce2b3214c7e0.html https://www.cnblogs.com/ZhangRuoXu/p/6397756.html https://blog.csdn.net/zhangphil/article/details/78962159 字符集......

之渊 ⋅ 24分钟前 ⋅ 0

weex,react native,flutter

weex: 一次编写,处处运行 RN: 学一次,到处写(针对安卓,IOS平台特性 各自写,会有很大一部分是一样的代码) 这些方案是否真正的解决了跨平台问题呢?从目前的状况来看,很显然是没有的,因...

东东笔记 ⋅ 30分钟前 ⋅ 0

Spring Cloud微服务分布式云架构-集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

明理萝 ⋅ 35分钟前 ⋅ 1

SpringMVC图片上传问题解决

当我们上传图片时一直发现: MultipartFile file = null; if (request instanceof MultipartHttpServletRequest) 匹配不上, 解决方案: 在前端xml加入如下配置代码即可 <!-- 图片上传bean --...

泉天下 ⋅ 37分钟前 ⋅ 0

Spring表达式语言(SpEL)

1、SpEL引用 Spring EL在bean创建时执行其中的表达式。此外,所有的Spring表达式都可以通过XML或注解的方式实现。下面将使用Spring表达式语言(SpEL),注入字符串,整数,Bean到属性。 SpEL的...

霍淇滨 ⋅ 53分钟前 ⋅ 0

Gradle使用阿里云镜像

gradle 生命周期中有一个初始化( Initialization )的过程,这个过程运行在 build script 之前,我们可以在这个地方做一点系统全局的设置,如配置仓库地址。 你可以在以下几个位置实现仓库地址...

明MikeWoo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部