`

Java正则表达式

阅读更多

一.概述
    正则表达式是Java处理字符串、文本的重要工具。
    Java对正则表达式的处理集中在以下两个两个类:
    java.util.regex.Matcher   模式类:用来表示一个编译过的正则表达式。
    java.util.regex.Pattern   匹配类:用模式匹配一个字符串所表达的抽象结果。
实例:

package com.bijian.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex {
	
	public static void main(String[] args) {
		
		Pattern p = Pattern.compile("f(.+?)k");
		Matcher m = p.matcher("fckfkkfkf");
		while (m.find()) {
			String s0 = m.group();	//fck||c
			String s1 = m.group(1);	//fkk||k
			System.out.println(s0 + "||" + s1);
		}
		System.out.println("---------");
		m.reset("fucking!");
		while (m.find()) {
			System.out.println(m.group());	//fuck
		}

		Pattern p1 = Pattern.compile("f(.+?)i(.+?)h");
		Matcher m1 = p1.matcher("finishabigfishfrish");
		while (m1.find()) {
			String s0 = m1.group();//finish  fishfrish
			String s1 = m1.group(1);//in	ishfr
			String s2 = m1.group(2);//s		s
			System.out.println(s0 + "||" + s1 + "||" + s2);
		}

		System.out.println("---------");
		Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])");
		Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31");
		while (m3.find()) {
			System.out.println(m3.group());
			//1900-01-01
			//2007/08/13
			//1900.01.01
			//1900 01 01
			//1900 02 31
		}
	}
}

运行结果:

fck||c
fkk||k
---------
fuck
finish||in||s
fishfrish||ishfr||s
---------
1900-01-01
2007/08/13
1900.01.01
1900 01 01
1900 02 31

 

二.一些容易迷糊的问题
1.Java对反斜线处理的问题
        在其他语言中,\\表示要插入一个字符\;
        在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。
        看API文档:

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

        但是看看上面程序,对比下不难看出:\d在实际使用的时候就写成了\\d
        在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\\\,原因是下面的APIDoc定义\\表示一个反斜线。
        但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r。

字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符

 
2.Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。
 
3.Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用Matcher.reset()重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零,或者Matcher.reset(CharSequence input)重置此具有新输入序列的匹配器,来重复使用匹配器。
 
4.组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:

        A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
        A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
        int groupCount():返回匹配其模式中组的数目,不包括第0组。
        String group():返回前一次匹配操作(如find())的第0组。
        String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。
        int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。
        int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。

5.匹配的范围的控制
        最变态的就要算lookingAt()方法了,名字很让人迷惑,需要认真看APIDoc。
        start()返回以前匹配的初始索引。
        end()返回最后匹配字符之后的偏移量。
        public boolean lookingAt()尝试将从区域开头开始的输入序列与该模式匹配。与matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。如果匹配成功,则可以通过start、end和group方法获取更多信息;当且仅当输入序列的前缀匹配此匹配器的模式时才返回true。
 
6.Pattern标记
Pattern类的静态方法:
        static Pattern compile(String regex, int flags):将给定的正则表达式编译到具有给定标志的模式中,其中的flags参数就是Pattern标记,这个标记在某些时候非常重要。
        Pattern.CANON_EQ:启用规范等价。
        Pattern.CASE_INSENSITIVE:启用不区分大小写的匹配。
        Pattern.COMMENTS:模式中允许空白和注释。
        Pattern.DOTALL:启用 dotall 模式。
        Pattern.LITERAL:启用模式的字面值分析。
        Pattern.MULTILINE:启用多行模式。
        Pattern.UNICODE_CASE:启用 Unicode 感知的大小写折叠。
        Pattern.UNIX_LINES:启用 Unix 行模式。
 
三.字符串的替换
        String.replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。
        String.replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。
        String.replaceAll(String regex, String replacement):使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
        String.replaceFirst(String regex, String replacement):使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。
        StringBuffer.replace(int start, int end, String str):使用给定 String 中的字符替换此序列的子字符串中的字符。
        StringBuilder.replace(int, int, java.lang.String):使用给定 String 中的字符替换此序列的子字符串中的字符。
        Matcher.replaceAll(String replacement):替换模式与给定替换字符串相匹配的输入序列的每个子序列。
        Matcher.replaceFirst(String replacement):替换模式与给定替换字符串匹配的输入序列的第一个子序列。
 
四.字符串的切分
        String[] split(String regex):根据给定的正则表达式的匹配来拆分此字符串。
        String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串。
        当然,还有一个StringTokenizer类,可以用来切分字符串,但是现在SUN已经不推荐使用了。转变下思路,其实用正则表达式也可以达到将字符串切分为段的目的。

 

五.没有提到的
        正则表达式的API简单好用,没太多复杂的地方,并非不重要,正则表达式最大的难点在于熟练书写正则表达式。
        有关正则表达式的规范,在Pattern类APIdoc中都有非常详细的介绍,而且条理清晰,在此就不赘述了。

 

文章来源:http://lavasoft.blog.51cto.com/blog/62575/179324

分享到:
评论

相关推荐

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    java正则表达式匹配工具

    Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...

    java正则表达式验证IP地址

    Java正则表达式验证IP地址 Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

    使用Java正则表达式分析处理日志

    本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...

    JAVA正则表达式大全

    以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`...

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    Java 正则表达式库

    Java正则表达式库是Java开发中不可或缺的一部分,它为开发者提供了一种强大的文本匹配工具。在Java中,正则表达式(Regular Expression)是一种模式匹配语言,用于处理字符串操作,如查找、替换或提取特定模式的数据...

    Java正则表达式测试工具

    Java正则表达式测试工具是面向开发者和爱好者的一款实用程序,它可以帮助用户验证和调试他们的正则表达式。在Java编程环境中,正则表达式是一个强大的字符串处理工具,广泛用于数据验证、文本搜索和替换等任务。这款...

    使用Java正则表达式实现一个简单的身份证号码验证

    ### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...

    常用java正则表达式

    ### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...

    java正则表达式截取demo下载即可运行

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。这个“java正则表达式截取demo”提供了一个可以直接运行的示例,帮助开发者理解如何在Java中使用正则...

    java正则表达式教程html版带目录

    Java正则表达式是Java编程语言中的一个强大工具,它用于模式匹配和字符串处理,尤其在数据验证、文本检索和替换等方面发挥着重要作用。本教程是专为初学者设计的HTML版,旨在帮助读者快速掌握Java正则表达式的概念和...

    java正则表达式使用例子

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或分割文本。在Android开发中,正则表达式尤其重要,因为它们可以帮助我们验证用户输入、处理文本数据或者进行复杂的...

    Java正则表达式应用总结

    Java正则表达式是编程语言Java中用于处理字符串和文本的强大工具。它允许开发者通过模式匹配来执行复杂的文本分析和操作。在Java中,正则表达式的操作主要涉及两个核心类:`java.util.regex.Matcher`和`java.util....

    Java正则表达式详细讲解

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。在Java中,正则表达式是通过`java.util.regex`包提供的API来实现的。本讲解将深入探讨Java正则表达式的...

    强大的JAVA正则表达式处理包jakarta-oro

    Java正则表达式是编程语言中的一个重要组成部分,用于文本处理和模式匹配。Jakarta ORO(Oracle Regular Expressions for Java)是Apache软件基金会开发的一个强大的Java正则表达式库,它为开发者提供了更为灵活和...

    Java 正则表达式 图片版

    Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~

Global site tag (gtag.js) - Google Analytics