正则表达式语法结构图:

Java正则表达式类库结构图:

Java典型例子

1、String类 matches()方法

判断字符串是否符合特定正则表达式

@Test public void testRegex(){
	String regex = ".*\\d{3}.*";
	String str1 = "11tec34";
	String str2 = "285dffd";
	String str3 = "bac7736db";
	//输出:false, true, true
	System.out.println(str1.matches(regex) + "," + str2.matches(regex) + "," + str3.matches(regex));
}

2、String类 split()方法

用正则表达式分割字符串

@Test public void testRegex2(){
	String input = "hello3world8my9name1is5jacket";
	String regex = "\\d";  //以数字作为分隔符
	String strs[] = input.split(regex);
	//输出:hello world my name is jacket
	for(String str : strs){
		System.out.print(str + " ");
	}
	System.out.println();

	input = "hellodogworlddogmydognamedogisdogjacket";
	regex = "dog";  //以"dog"字符作为分隔符
	strs = input.split(regex);
	//输出:hello world my name is jacket
	for(String str : strs){
		System.out.print(str + " ");
	}
}

3、String类 replace()方法

用正则表达式替换字符

@Test public void testRegex3(){
	String input = "hello3world8my9name1is5jacket";
	String regex = "\\d";  //以数字作为分隔符
	String firstStr = input.replaceFirst(regex, ":"); //只替换第一个匹配的字符
	String allStr = input.replaceAll(regex, ":");  //替换所有匹配的字符
	//输出:
	//hello:world8my9name1is5jacket
	//hello:world:my:name:is:jacket
	System.out.println(firstStr);
	System.out.println(allStr);
}

4、Pattern.matches() 静态方法

判断字符串是否符合正则表达式,等同于String类的matches()方法

@Test public void testRegex4(){
	String regex1 = "\\bdog\\b";
	String regex2 = ".*\\bdog\\b.*";
	String input = "dog dog dog doggie dogg";
	//输出:false,true
	System.out.println(Pattern.matches(regex1, input) + "," + Pattern.matches(regex2, input));
}

5、Pattern类 split()方法

根据正则表达式分割字符串,等同于String类的split()方法

//6.split() 分割字符串  -> 等同于String的split()方法
@Test public void testRegex6(){
	String regex = "\\d";
	String input = "hello3world5hello8java";
	Pattern p = Pattern.compile(regex);
	String strs[] = p.split(input);
	//输出:hello world hello java
	for(String str : strs){
		System.out.print(str + " ");
	}
}

6、Pattern.quote() 静态方法

获取匹配此字符串的正则表达式

@Test public void testRegex6(){
	//例子1
	String input = ".";
	String regex = Pattern.quote(input);
	boolean flag = Pattern.matches(regex, input);
	//输出:\Q353434\E	true
	System.out.println(regex);
	System.out.println(flag);

	//例子2
	input = "test.test";
	String errorOutput = input.replaceAll(".", "/");
	//输出://///////
	System.out.println(errorOutput);

	//例子3
	String correctOutput = input.replaceAll(Pattern.quote("."), "/");
	//输出:test/test
	System.out.println(correctOutput);
}

7、Matcher类 find()方法,start()方法,end()方法

@Test public void testRegex7(){
	//m.start()   m.end()
	String regex = "\\bdog\\b";
	String input = "dog dog dog doggie dogg";
	Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);        // 获得匹配器对象
    int count = 0;
    while (m.find()) {
           count++;
           //Match number 1,start(): 0,end(): 3
           //Match number 2,start(): 4,end(): 7
           //Match number 3,start(): 8,end(): 11
           System.out.print("Match number " + count);
           System.out.print(",start(): " + m.start());
           System.out.println(",end(): " + m.end());
    }
}

8、Matcher类 find(int index)方法,start(int index),end(int index)

@Test public void testRegex8(){
	//m.start()   m.end()
	String regex = "\\bdog\\b";
	String input = "dog dog dog doggie dogg";
	Pattern p = Pattern.compile(regex);
      Matcher m = p.matcher(input);        // 获得匹配器对象

    //m.find(int start)
    //输出:start(): 0,end(): 3
    //start(): 4,end(): 7
    m.find(0);  //从要匹配的字符串的第几个字符开始寻找
    System.out.print("start(): " + m.start());
    System.out.println("end(): " + m.end());
    m.find();
    System.out.print("start(): " + m.start());
    System.out.println("end(): " + m.end()); 

    //m.find(int start)
    //输出:start(): 4,end(): 7
    //start(): 8,end(): 11
    m.find(4);
    System.out.print("start(): " + m.start());
    System.out.println("end(): " + m.end());
    m.find();
    System.out.print("start(): " + m.start());
    System.out.println("end(): " + m.end()); 

    //m.start(int group)	m.end(int group)
    m.find(0);	//
    int firstStartGroupIndex = m.start(0);
    System.out.println(firstStartGroupIndex);
}

9、Matcher类 lookingAt()方法,matches()方法

判断字符串是否匹配特定的正则表达式,lookingAt()方法不要求全部匹配,而matches()方法要求全部匹配

@Test public void testRegex9(){
	String regex = "foo";
	String str = "fooooooooooooooooo";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str); 

        System.out.println("Current regex is: " + regex);
        System.out.println("Current str is: " + str); 

        System.out.println("lookingAt(): " + matcher.lookingAt());  //true
        System.out.println("matches(): " + matcher.matches()); 	//false,因为matches要求全部匹配
}

此外还有其他的Matcher类的方法未整理,

//还有Matcher类的其他方法未整理:

//1.group(int group)方法

//2.appendReplacement() / appendTail() / replaceAll() / replaceFirst() / quoteReplacement()

//99.Matcher类的find()方法,start()方法,end()方法

  

更多详细的正则表达式博文可以参考:

微软官方文档:https://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx

一个很好的正则表达式教程:http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html#reg7

4.熟悉Java基本类库系列——Java 正则表达式类库的更多相关文章

  1. Java面试题系列 ----- Java基础面试题(91道)

    更多详情点击查看,点这里!这里!!这里!!! 文末获取所有面试PDF文档! Java概述 1. 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了 ...

  2. 2.熟悉Java基本类库系列——Java IO 类库

    Java中常用的IO操作基本上可以分为四大部分,分别是:File类操作.RandomAccessFile类操作.字节流操作.字符流操作.只要熟练掌握了本文中所列举的所有例子,基本上对于Java的IO流 ...

  3. 1.熟悉Java基本类库系列 - 目录

    写这个系列是想让自己多熟悉熟悉Java的基本类库,忘记的时候可以在这里看看之前写过的例子,这样就可以很快的回忆起来如何使用了. 这样就可以很节省时间了. ======= 下面是传送门啦 ======= ...

  4. java高并发系列 - 第14天:JUC中的LockSupport工具类,必备技能

    这是java高并发系列第14篇文章. 本文主要内容: 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例 介绍LockSupport主要用法 对比3种方式,了解他们之间的区别 LockSuppor ...

  5. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  6. java高并发系列 - 第13天:JUC中的Condition对象

    本文目标: synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition实现生产者消费者 使用Condition实现同步阻塞队列 Object对 ...

  7. java高并发系列 - 第2天:并发级别

    由于临界区的存在,多线程之间的并发必须受到控制.根据控制并发的策略,我们可以把并发的级别分为阻塞.无饥饿.无障碍.无锁.无等待几种. 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继 ...

  8. java基础解析系列(三)---HashMap

    java基础解析系列(三)---HashMap java基础解析系列 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...

  9. java高并发系列-第1天:必须知道的几个概念

    java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...

随机推荐

  1. Android 增量更新

    title: Android NDK之增量更新 1.增量更新使用到的库bsdiff和bzip2 bsdiff库是一个开源的二进制差分工具,通过对比Apk的二进制,从而进行差分包的生成. bsdiff库 ...

  2. 关于ImageLoader的一些东西

    网络图片异步加载 其实有关图片加载存在这样一个问题,图片的下载始终是一个耗时的操作,这个时候如果把图片加载放在主线程中话的是不明智的,模拟一个这样的场景, 假如在一个listview或Recycler ...

  3. mfc---拖曳文件

    拖曳文件: 文件拖曳会触发OnDropFiles(HDROP hDropInfo)消息: int count = DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,_MA ...

  4. Linux i2c子系统(一) _动手写一个i2c设备驱动

    i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 ...

  5. 使用Microsoft.ExceptionMessageBox.dll捕获WinForm程序中异常信息并弹窗显示

    WinForm程序开发中,在开发模式下对于异常的处理一般都是通过调试的方式来查找异常发生的未知与原因. 下面以“除数为0”的情况来具体说明. Button按钮事件如下: private void bu ...

  6. J2ee技术难点

    J2ee技术难点 session/cookie区别联系 jsp/servlet区别联系 filter执行流程 openSessionInView原理 clone与servilizable区别联系 eq ...

  7. mysql中的一些操作语句,留存

    CREATE TABLE `poision` ( `username` varchar(20) NOT NULL , `nowtime` varchar(50) NOT NULL , `poision ...

  8. 咖啡师之路:第一日一杯Espresso

    代码敲累了.产品要发布了.熬夜啊加班啊. 精神完全不在状态. 咋办--- 咋办--- 咋办---! 来一杯Espresso浓缩咖啡.各位码农,码神们的必备良品! 咖啡每天要2-3杯,不管是速溶还是现磨 ...

  9. [Selenium With C#基础教程] Lesson-07 复选框

    作者:Surpassme 来源:http://www.jianshu.com/p/98ede43da3c3 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢.   [作者:Surp ...

  10. 从Hash Killer I、II、III论字符串哈希

    首先,Hash Killer I.II.III是BZOJ上面三道很经典的字符串哈希破解题.当时关于II,本人还琢磨了好久,但一直不明白为啥别人AC的代码都才0.3kb左右,直到CYG神犇说可以直接随机 ...