4.熟悉Java基本类库系列——Java 正则表达式类库

正则表达式语法结构图:

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

时间: 2024-11-17 15:21:32

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

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

Java中常用的IO操作基本上可以分为四大部分,分别是:File类操作.RandomAccessFile类操作.字节流操作.字符流操作.只要熟练掌握了本文中所列举的所有例子,基本上对于Java的IO流操作就可以说是掌握了. 下面将以JUnit测试用例的方式,用一个个例子的方式列出这四大部分中常用的操作例子. 一.File类操作 File类操作定义了最基本的.与操作系统的稳健系统相关的操作,可以对文件夹.文件进行一系列的操作.  1.常用的一些用法 //1.两个常量 @Test public vo

Java报错系列——java.util.Date/java.sql.Date/java.sql.Timestamp

前言 前几天,在项目中,遇到一个问题,情况很简单,就是从MYSQL数据库中取出的时间只有年月日,而没有时分秒.然后,第一直觉就是肯定是我导入的包有问题,果然,我导入的是java.sql.Date包,修正为java.util.Date,问题依旧.这是为什么呢?曾经记得,java.util.Date会取出日期+时间,而java.sql.Date只会有日期.这是对的吗?MYSQL的时间类型经常是datetime/timestamp,我们应该怎么做呢? 实验 MYSQL表准备: 代码: 输出: 结论 无

java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以访问特定的资源. Semaphore常用场景:限流 举个例子: 比如有个停车场,有5个空位,门口有个门卫,手中5把钥匙分别对应5个车位上面的锁,来一辆车,门卫会给司机一把钥匙,然后进去找到对应的车位停下来,出去的时候司机将钥匙归还给门卫.停车

{Java初阶系列一}--------Java基本简介

{Java初阶系列}--------Java基本简介 本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授<Java核心技术>,在此感谢老师! 首先说明下Java作为一门编译性语言是如何运行: 首先由程序yuan编写的java程序,由javac.exe编译成字节码文件.class,再通过java.exe在jvm上运行成电脑可以识别的机器语言-------这个也被称为"一次编译,多次运行,跨平台操作",这都是jvm的功劳. 2. 初次学习我碰到疑问:jre

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

Java集合干货系列-(一)ArrayList源码解析

前言 今天来介绍下ArrayList,在集合框架整体框架一章中,我们介绍了List接口,ArrayList继承了AbstractList,实现了List.ArrayList在工作中经常用到,所以要弄懂这个类是极其重要的.构造图如下:蓝色线条:继承绿色线条:接口实现 正文 ArrayList简介 ArrayList定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomA

JDK框架简析--java.lang包中的基础类库、基础数据类型

题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说.还是在一个层级上,它们都是须要被编译成字节码.在JRE中执行的,JDK编译后的结果就是jre/lib下的rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列全部文章基于的JDK版本号都是1.7.16. 源代码下载地址:https://jdk7.jav

Java知多少(8)类库及其组织结构

Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API. API(Application Programming Interface, 应用程序编程接口)是一个通用概念. 例如我编写了一个类,可以获取计算机的各种硬件信息,它很强大很稳定,如果你的项目也需要这样一个功能,那么你就无需再自己编写代码,将我的类拿来直接用就可以.但是,我的类代码很复杂,让你读完这些代码不太现实,而且我也不希望你看到我的代码(你也没必要也不希望读懂这些

JDK框架简析--java.io包中的输入输出类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下的rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 Java IO库提供了一个可以称之为链