`
BrokenDreams
  • 浏览: 249316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:98083
社区版块
存档分类
最新评论

Java-正则表达式-基础

阅读更多
        工作中有一段时间经常使用Java的正则表达式,整理一下,做个总结。
        JDK中提供了2个类来支持正则表达式,分别是java.util.regex.Pattern和java.util.regex.Matcher。前者表示一个模式,后者表示一个匹配器。
        我们在日常使用中,一般会根据需要,建立一个模式。模式的构建通过下面方法:
public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }

    或者
public static Pattern compile(String regex, int flags) {
        return new Pattern(regex, flags);
    }

        构建模式时,我们需要传入一个表达式和Match Flags(如果需要的话)。然后便可以得到一个根据传入的字符串型正则表达式而生成的模式实例。可以用这个实例来匹配一些字符串,调用如下方法:
public Matcher matcher(CharSequence input)

        此方法返回一个匹配器,接着调用匹配器的相关方法便可判断目标字符串是否匹配我们构建的模式。方法如下:
public boolean matches()

        举个简单的例子,现在要判断一个字符串是否是一个以186开头,一共11位的手机号码:
public static void main(String[] args) {
		//目标字符串
		String s = "18612345678";
		//创建匹配模式
		Pattern pattern = Pattern.compile("^186\\d{8}$");
		//得到匹配器
		Matcher matcher = pattern.matcher(s);
		//打印匹配结果
		System.out.println("isMatch="+matcher.matches());
	}

输出为:
isMatch=true

符号'^'表示一行的开始;'\\d'表示数字,这里两个'\'是因为反斜杠在java的字符串中需要转义;'{8}'跟在'\\{d}'后面表示有8个这样的数字;'$'表示一行的结束

下面是一些常用正则表达式的字符集、运算符、匹配符等。
\xhh 16进制值0xhh 所表示的字符
\uhhhh 16进制值0xhhhh 所表示的Unicode字符
\t Tab
\n 换行符
\r 回车符
\f 换页符
\e Escape
. 表示任意一个字符
[abc] 表示字符a ,b ,c 中的任意一个
[^abc] 除a ,b ,c 之外的任意一个字符
[a-zA-Z] 从a 到z 或A 到Z 当中的任意一个字符
[abc[hij]] a,b,c,h,i,j 中的任意一个字符
[a-z&&[hij]] h,i,j 中的一个
\s 空格字符(空格键, tab, 换行, 换页, 回车)
\S 非空格字符([^\s] )
\d 一个数字,也就是[0-9]
\D 一个非数字的字符,也就是[^0-9]
\w 一个单词字符(word character),即[a-zA-Z_0-9]
\W 一个非单词的字符,[^\w]
XY X 后面跟着 Y
X|Y X或Y
(X) 一个"要匹配的组(capturing group)". 以后可以用\i来表示第i个被匹配的组
^ 一行的开始
$ 一行的结尾
\b 一个单词的边界
\B 一个非单词的边界
\G 前一个匹配的结束
X? 匹配一个或零个X
X* 匹配零或多个X
X+ 匹配一个或多个X
X{n} 匹配正好n个X
X{n,} 匹配至少n个X
X{n,m} 匹配至少n个,至多m个X


我们可以匹配一个比较长的字符串。
public static void main(String[] args) {
		//目标字符串
		String input = "127.0.0.1 - - [22/May/2013:23:33:45 +0800] \"GET / HTTP/1.1\" 200 7446";
		//创建匹配模式
		Pattern pattern = Pattern.compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\s+\\S+\\s+\\S+\\s+\\[[^\\]]+\\]\\s+\"\\S+\\s+/\\s+[^\"]+\"\\s+\\d+\\s+\\d+$");
		//得到匹配器
		Matcher matcher = pattern.matcher(input);
		//打印匹配结果
		System.out.println("isMatch="+matcher.matches());
	}

输出为:
isMatch=true

观察上面例子的目标字符串(实际上是tomcat的访问日志,这里的正则表达式并不严格,只是做一个简单示范),我们有时可能想要从这些字符串中把一些敏感信息取出来,比如上面目标字符串中的‘IP地址’、‘时间部分’、‘请求方法’、‘协议部分’、‘状态码’。我就需要在表达式中加入捕获式‘()’,然后通过Matcher的API将这些部分取出来,代码如下:
public static void main(String[] args) {
		//目标字符串
		String input = "127.0.0.1 - - [22/May/2013:23:33:45 +0800] \"GET / HTTP/1.1\" 200 7446";
		//创建匹配模式
		Pattern pattern = Pattern.compile("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s+\\S+\\s+\\S+\\s+\\[([^\\]]+)\\]\\s+\"(\\S+)\\s+/\\s+([^\"]+)\"\\s+(\\d+)\\s+\\d+$");
		//得到匹配器
		Matcher matcher = pattern.matcher(input);
		
		if(matcher.find()){
			for(int i=1;i<=matcher.groupCount();i++){
				System.out.println("第"+i+"个捕获的内容为:"+matcher.group(i));
			}
		}
	}

输出为:
第1个捕获的内容为:127.0.0.1
第2个捕获的内容为:22/May/2013:23:33:45 +0800
第3个捕获的内容为:GET
第4个捕获的内容为:HTTP/1.1
第5个捕获的内容为:200

注意:matcher的第一个组"matcher.group(0)"为input本身。

        另外,我们可以在正则表达式中通过‘\i’来引用前面第i个捕获内容,代码如下:
public static void main(String[] args) {
		//目标字符串 假设我们要匹配一段被双引号或者单引号修饰的字符串
		String s = "\"src\"";
		//创建匹配模式
		Pattern pattern = Pattern.compile("^([\"'])[^\"]+\\1$");
		//得到匹配器
		Matcher matcher = pattern.matcher(s);
		//打印匹配结果
		System.out.println("isMatch="+matcher.matches());
	}

输出为:
isMatch=true

注意:‘\1’引用的是第一个捕获的实际内容,而不是表达式里括号的内容。也就是说,如果目标字符串右侧的双引号变成单引号,那么结果为false。

        我们也可以在替换字符串的时候来引用捕获的内容,代码如下:
public static void main(String[] args) {
		//目标字符串 把所有的小数后面2位以后的部分截掉,不考虑四舍五入
		String s = "a:3.567 b:1.2355 c:0.4401";
		//创建匹配模式
		Pattern pattern = Pattern.compile("(\\d\\.\\d\\d)\\d*");
		//得到匹配器
		Matcher matcher = pattern.matcher(s);
		
		s = matcher.replaceAll("$1");
		
		System.out.println("s="+s);
	}

输出为:
s=a:3.56 b:1.23 c:0.44

上面的代码也可以直接写成:
s = s.replaceAll("(\\d\\.\\d\\d)\\d*", "$1");


        关于Java正则表达式一些基础的东西简单总结到这里。
分享到:
评论

相关推荐

    java基础09-正则表达式.pptx

    正则表达式,又称规则...当然在Java中也可以通过处理字符串的方式达到检索,替换文本字符串的目的,但是有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的,当然这也是建立在熟悉正则表达式的基础之上的。

    JAVA 正则表达式 教程

    该教程中所介绍的正则表达式应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达式语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达式基础的学习者。在学习完该...

    java正则表达式学习笔记

    Java正则表达式学习笔记,比较基础,适合初学者

    java常用基础正则表达式参考文档

    java常用基础正则表达式参考文档,java常用基础正则表达式参考文档

    Java 正则表达式基础

    Java 正则表达式基础,Java 正则表达式基础,Java 正则表达式基础,Java 正则表达式基础,Java 正则表达式基础

    正则表达式完整高清版

    全书分为三大部分:第一部分主要讲解正则表达式的基础知识,涵盖了常见正则表达式中的各种功能和结构;第二部分主要讲解关于正则表达式的更深入的知识,详细探讨了编码问题、匹配原理、解题思路;第三部分将之前介绍...

    Java语法基础+一些 JAVA案例,和正则表达式

    Java语法基础+一些 JAVA案例,和正则表达式

    精通正则表达式~~~

    精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...

    Java正则表达式详解

    Java正则表达式详解 正则表达式基础知识 Jakarta-ORO库 应用实例

    groovy正则表达式基础1

    Groovy 正则表达式 Groovy正则表达式语法 背景项目使用Gradle作为自动化构建的工具, 闲暇之余对这个工具的使用方式以及其配置文件依赖的Groov

    Java正则表达式入门介绍

    1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的...

    Java正则表达式详解.doc

    Java正则表达式详解.doc 正则表达式的基础讲解。

    正则表达式.docx

    正则表达式用法以及案例全篇 内含正则表达式所有基础符号和用法 含java操作代码案例 含实际案例及java详解

    Java正则表达式.ppt

    Java正则表达式详细演示文稿,正则表达式是所有编程的基础,java里的具体应用及编写模式如何呢,请具体看文档。

    java正则表达式使用说明

    java正则表达式使用说明和正则表达式基础知识

    java工具类-正则

    java基础,工具类-正则基础,自己总结的笔记。

    正则表达式大全(超好)

    想学正则表达式的,必看,看完必会,包看包会,从基础到高级应用。

    详解linux正则表达式(基础正则表达式+扩展正则表达式)

    正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一定离不开正则表达式的配合。 1、什么是正则...

    正则表达式用法大全

    公司最近需要大量用到正则表达式,所以在原有的基础上,自己改版了那个表达式文档,希望可以帮到大家。

    正则表达式教程.pdf

    本文介绍如何使用 java.util.regex API 作为正则表达式模式匹配。虽然说这个包中可被接受的语法参数与 Perl 是相似的,但我们并不需要掌握 Perl 的语法知识。本教程将从基础开始,逐层深入到更多的高级技巧。

Global site tag (gtag.js) - Google Analytics