正则表达式语法结构图:

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. 一期结业KTV项目难点

    查询完成后给歌曲便利到一个数组当中将选中的歌曲对象加入到playlist类中的数组songs. 创建类名称: class Playlist       {   //定义一个长度为50的数组       ...

  2. MySQL逻辑备份利器-mydumper

    关于mydumper的简介和下载请访问:https://launchpad.net/mydumper 简言之,mydumper是多线程逻辑备份,对于表和数据量很大的情况下,建议使用mydumper提高 ...

  3. jQuery写选项卡

    <!DOCTYPE html> <htmllang="en"> <head> <metacharset="UTF-8" ...

  4. HP DL388 gen9服务器安装RHEL 6.5系统

    测试: 1.默认UEFI模式,F10下智能安装,如果选择自己划分分区,进入该选项后会看到系统自动就帮我们创建了一个/efi 的500M分区,一开始我就是被这个分区坑了的,要知道服务每次重启都要等很久的 ...

  5. Filebeat issue 排查--single.go:140: ERR Connecting error publishing events (retrying): dial tcp ****:5044: i/o timeout

    我个人用docker搭建了一套日志分析平台:ELK+Filebeat 在正常跑了半个多月之后,Kibana刷新日志时突然发现日志不在更新了,停在某个时刻,就再也没有新log. 首先我查看了elk,lo ...

  6. 手把手教你webpack、react和node.js环境配置(上篇)

    很多人刚学习react的时候,往往因为繁琐的配置而头疼,这里我将手把手教大家怎么用webpack配置react和redux的环境,这篇教程包括前端react和后台node整个网站的环境配置,对node ...

  7. 关于Storm Stream grouping

    在Storm中, 开发者可以为上游spout/bolt发射出的tuples指定下游bolt的哪个/哪些task(s)来处理该tuples.这种指定在storm中叫做对stream的分组,即stream ...

  8. 数据库基础——(SQLserver)约束

                                                              数据库定义:一些存储在硬盘上的数据文件 内存:计算机临时存储的一些数据 .net - ...

  9. Android--多线程之Handler 前言

    前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的 ...

  10. 1935: [Shoi2007]Tree 园丁的烦恼

    1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 648  Solved: 273[Submit][ ...