`
xifangyuhui
  • 浏览: 188584 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习正则表达式:Pattern类

阅读更多

 正则表达式在处理文本方面用处非常大,最早像在Perl和awk语言中,提供了这种机制,Java在Java 2中也增加了正则表达式这个包java.util.regex。这个包为用户使用正则表达式,提供了易用而全面的支持。

    我的研究方向是web挖掘。从网页中提取内容,处理文本,当然需要正则表达式这个强大的工具了。 

一、首先我们看一下怎么使用正则表达式的一个例子: 
A Matcher examines the results of applying a pattern. 
我们希望从这句话中找到所有开头为a的单词。 

  当然这只是一个简单的例子,你可以使用String提供的split方法,得到单词数组,然后 遍历各个单词看是否是否开头为a 
我们现在看看怎么使用正则表达式来处理这个问题

import java.util.regex.*;

 public class FindA{

 public static void main(String args[]) throws Exception{

 String candidate ="A Matcher examines the results of applying a pattern.";

 String regex = \\ba\\w*\\b;

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(candidate);

String val = null;

System.out.println("INPUT: " + candidate);

System.out.println("REGEX: " + regex +"\r\n");

while (m.find()){

 val = m.group();

 System.out.println("MATCH: " + val);

 }

if (val == null) {

System.out.println("NO MATCHES: ");

}

}

}


 


     从这个例子我们可以看到正则表达式涉及到的两个类Matcher和Pattern,我们以后会专门讨论着连个类。现在主要看看使用正则表达式的流程: 
首先使用Pattern的一个静态的方法compile来创建Pattern对象,

 Pattern p = Pattern.compile(regex);

然后调用Pattern的方法matcher Matcher m = p.matcher(candidate);


得到了Matcher对象,Matcher对象保存了许多匹配信息,然后可以通过find()方法查找匹配的部分,如果有匹配的部分,返回真,使用m.group方法得到匹配的各组值, 否则find返回false. 
当然这只是一般的过程,还有许多更细的方法,在以后会陆续的总结,下面我们看一下 

String regex = "\\ba\\w*\\b"; 这个就是一个正则表达式,b,w,*都是正则表达式的meta character原字符, \b表示单词的边界,w表示任意的可构成单词的字母数字,*表示前面的字母(当然可以是更复杂的组之类的了东东)重复0次或0次以上, a当然还是a了。所以这个regex就匹配单词开头为a的单词了。

 二、下面总结一下基本的正则表达式的meta character以及它们含义:

 .匹配任意一个字符    $ 匹配一行的结尾    ^ 匹配一行的开头(在[]里面表示否定) 

{} 定义了一个范围 [] 定义了一个字符类 () 定义了一个组         

*前面出现0次以上       + 前面匹配一次以上 ?前面出现0次或一次  

\ 后面的字符不会看作metacharacter       \w 字母数字下划线   

\W 非字母数字下划线 \d 单个数字    \D单个非数字  

| 或,二者之一   &&与操作符    \b单词边界

 

下面看看几个简单的例子:

[abc] a、b 或 c(简单类)               [^abc] 任何字符,除了a、b 或 c(否定)        

[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)              

[a-d[m-p]] a 到 d 或 m 到 p:  

[a-dm-p](并集)                     [a-z&&[def]] d、e 或 f(交集)                  

[a-z&&[^bc]] a 到 z,除了 b 和 c:

[ad-z](减去)            [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

 三、java.util.regex提供的操作接口:

 java.util.regex包提供了操作正则表达式的模型,整个模型优雅而简洁,只有三个类:

Pattern、Matcher和 PatternSyntaxException

下面将要总结他们提供的方法,以及如何灵活应用来处理文本。

我们还是从Pattern的静态工厂方法来扩展吧:


static Pattern compile(String regex)


将给定的正则表达式编译到模式中,并创建Pattern对象,这个方法通常是操作正则表达式的第一步,从前面那个例子 
我们也可以看到整个的流程。 
在看看一个重载的compile方法: 

static Pattern compile(String regex, int flags)


将给定的正则表达式编译到具有给定标志的模式中。 这个方法参数flags提供了一些特殊的选项来用于特殊的处理, 
我们下面看看可使用的选项:

UNIX_LINES:这个主要处理UNIX和其他的操作系统在行结束符不一样的问题,UNIX使用\n代表一行的终止,而Windows 
则使用了\r\n,\n,\r,\u2028或者\u0085作为一行的结束符。

CASE_INSENSITIVE:当我们在匹配的时候要忽略字符大小写时 

COMMENTS:允许我们在正则表达式中使用注释,例如

Pattern p =Pattern.compile("A #matches uppercase US-ASCII char code 65",Pattern.COMMENTS);


MULTILINE:表明要输入多行,他们有自己的终止字符。 

Pattern p = Pattern.compile("^.", Pattern.MULTILINE);


如果你的输入的字符串是:This is a sentence.\nSo is this.. 
这样我们匹配的字符是This中的T和So中的S,如果不使用MULTILINE,则只会匹配T 
程序:

import java.util.regex.*;

public class Multiline{

public static void main(String args[]) throws Exception{

 String candidate ="This is a sentence.\nSo is this..";

String regex = "^.";

Pattern p = Pattern.compile("^.", Pattern.MULTILINE); //Pattern p = Pattern.compile(regex,Pattern.MULTILINE);

Matcher m = p.matcher(candidate);

String val = null;

 System.out.println("INPUT: " + candidate);

System.out.println("REGEX: " + regex +"\r\n");

while (m.find()){

 val = m.group();

 System.out.println("MATCH: " + val);

}

 if (val == null) {

System.out.println("NO MATCHES: ");

}

}

}



DOTALL:使用这个选项之后metacharacter .就可以包括一行的终止字符了,如果没有这个选项, 一行的终止字符,并不会考虑在字符串之内的。 使用这个选项会降低效率 

Pattern p = Pattern.compile(".", Pattern.DOTALL);


如果我们输入的是Test\n,则匹配的字符是5个。

我们可以组合以上选项,只要使用|,进行按位或操作即可

Pattern p =   Pattern.compile("t # a compound flag example",Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE|Pattern.COMMENT);


我们还要注意点的是Java对转译字符\的处理,例如我们要匹配一个数字: 
我们不能使用: 

Pattern p = Pattern.compile("\d");


而是: 

Pattern p = Pattern.compile("\\d");


另外如果regex本身形式是错误的,compile方法会抛出java.util.regex.PatternSyntaxException异常。 

下面我们总结一下public Matcher matcher(CharSequence input)方法: 
    当我们使用compile操作,创建了Pattern对象之后,我们就可以使用Pattern对象的matcher操作,生成 matcher对象了,Matcher对象包含了许多对匹配结果集的操作,我们在总结Matcher对象的时候再说。另外 顺便提一下参数CharSequence,CharBuffer, Segment, String, StringBuffer, StringBuilder 都实现这个接口,所以参数可以是这些中的任一种类型了。 
下面我们看看: 

public int flags()


这个方法返回了我们前面可以设置的并且已经设置的flags选项,我们通过按位与来判断是否设置了某个选项: 

int flgs = myPattern.flags();

boolean isUsingCommentFlag =( Pattern.COMMENTS == (Pattern.COMMENTS & flgs)) ;



看看一个简化过程的方法: 

public static boolean matches (String regex,CharSequence input)



这个方法实际上是: 

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(candidate);

m.matches()


过程的一个简化,我们在后面总结Matcher中的matches方法之后就会理解这个了。

想必我们经常使用把字符串提取出token变成字符串数组的String中的split方法吧,下面我们看看 类似的一个方法: 
public String[] split(CharSequence input) 

这个方法提供了强大的功能,因为它可以使用正则表达式来作为token的分割: 

Pattern p = new Pattern.compile(",|and");

String fruits[] = p.split("apple,banana and orange");


split的一个重载的版本: 

public String[] split(CharSequence input, int limit)


它指定了划分的组数,有以下三种情况: 
limit==0 
这时候和没有limit参数的那个split效果一样 
limit>0 
如果你仅仅对前limit个感兴趣,你可以使用limit: 

String[] tmp = pattern.split("Hello, Dolly, You, Are, My, Favorite",3);

 //tmp[0] is "Hello",

 // tmp[1] is "Dolly";

//tmp[2] is "You, Are, My, Favorite";



limit<0 
会尽可能的划分所有的组,即使分割符后面是个空字符,也要单独生成一个token:"" 

Pattern p = Pattern.compile(","); String temp[] = p.split("Hello,Dolly,", -1); //temp[]={"Hello","Dolly",""}


 

 

 

分享到:
评论

相关推荐

    PB实现的正则表达式

    在压缩包中的"PbRegeXP"文件可能是作者提供的一个示例代码或库,包含了实现正则表达式的类、函数或其他组件。通过研究这个文件,开发者可以了解如何在PowerBuilder 11.5中构建自己的正则表达式解决方案。 在Power...

    正则表达式测试工具C#版(src)

    - 学习正则表达式的应用:查看源码可以学习如何在实际项目中使用`Regex`类进行正则匹配和替换操作。 - 调试技巧:源码中可能会有调试正则表达式的辅助逻辑,帮助开发者更好地理解和调试自己的正则表达式。 通过...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册十:正则表达式

    在JavaScript中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于执行模式匹配和字符串操作。本篇教程将深入探讨JavaScript中的正则表达式,帮助你理解和掌握这一核心概念。 一、正则表达式基础 ...

    正则表达式学习资料以及练习项目代码很多

    这个压缩包包含了丰富的正则表达式学习资源,适合有一定基础的初学者深入学习。 1. **基础概念** - **模式匹配**:正则表达式定义了一种模式,可以用来匹配符合该模式的字符串。 - **元字符**:如`.`代表任意单个...

    正则表达式:深入理解与应用.zip

    正则表达式(Regular Expression,简称regex...通过深入学习正则表达式,你可以更加高效地处理字符串,无论是数据提取、格式验证还是文本分析,都能得心应手。在实际工作中,灵活运用这些知识点,能大大提高工作效率。

    java正则表达式: regular expression(一)

    Java提供了`java.util.regex`包,其中包含`Pattern`、`Matcher`和`PatternSyntaxException`等类来支持正则表达式操作。 1. **Pattern类**:这是正则表达式的模板,可以编译成一个`Pattern`对象。编译的过程主要是将...

    各类正则表达式详细手册

    学习正则表达式不仅能提升编程效率,还能使你在处理复杂字符串任务时游刃有余。无论是数据库查询优化、网页爬虫开发还是前端表单验证,掌握正则表达式都将大大提高你的工作效率。因此,建议每一位IT从业者都应系统...

    c++写的正则表达式验证工具

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。...通过查看源代码,学习者可以深入了解如何在C++中利用第三方库实现正则表达式功能,并且掌握相关API的用法。

    java正则表达式匹配工具

    在Java中,正则表达式的使用主要依赖于`java.util.regex`包中的类,如`Pattern`和`Matcher`。 首先,我们来看`Pattern`类。这个类是正则表达式的模板,负责编译和存储正则表达式。一旦正则表达式被编译为`Pattern`...

    java_zhengze.rar_正则表达式_正则表达式 java

    本资料"java_zhengze.rar"提供了对Java正则表达式的详细讲解,包括基本概念、元字符、预定义字符类以及各种匹配操作,对于Java开发者来说是一份非常实用的学习资源。 首先,我们来了解一下正则表达式的基石——元...

    强大的正则表达式生成工具 C#版

    6. **教程和文档**:提供详细的正则表达式使用指南和C# API参考,帮助用户学习和理解正则表达式。 7. **版本控制**:保存和加载正则表达式模式,便于项目管理。 8. **错误检查**:检测并提示正则表达式中的语法...

    正则表达式学习书PDF

    学习正则表达式,首先要理解它的基本元素和结构,然后通过大量的实践来熟悉各种模式的组合。例如,可以学习如何使用`\d{3}-\d{4}`来匹配美国电话号码格式,或者用`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$...

    JAVA正则表达式大全

    正则表达式的学习需要对元字符、量词、预查、后向引用等概念有深入理解,同时掌握Java中`Pattern`和`Matcher`的使用方法,结合实际案例进行实践,才能灵活运用到实际项目中。在处理字符串相关问题时,熟练掌握正则...

    正则表达式调试工具

    3. **经典例程**:内建了各种经典的正则表达式示例,方便学习和参考,有助于开发者快速掌握正则表达式的常见用法。 4. **跨平台**:虽然题目并未明确指出该工具的具体跨平台特性,但通常这意味着它可以在不同的操作...

    常用正则表达式 正则表达式

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种特殊的语法来描述一个字符串集合,可以非常灵活地表示各种复杂的字符串格式...

    测试正则表达式软件

    这对于学习和优化正则表达式非常有帮助,避免了在代码中反复测试的麻烦。 总的来说,正则表达式是Java编程中不可或缺的一部分,熟练掌握其用法可以提高代码的效率和可读性。测试正则表达式的软件是开发者的好帮手,...

    源码(精通正则表达式&实战正则表达式)

    总之,通过这个资源,学习者不仅可以系统地学习正则表达式的理论知识,还能通过实例和源码加深对正则表达式的应用能力,这对于任何需要处理文本的JavaScript开发者来说都是极其宝贵的财富。无论是前端开发、后端开发...

    正则表达式学习资料

    - **Pattern类**:用于编译正则表达式并创建一个模式对象,例如`Pattern pattern = Pattern.compile("正则表达式")`。 - **Matcher类**:通过Pattern对象的`matcher(String input)`方法获取,用于在输入字符串上...

    C#字符串和正则表达式参考手册

    学习和熟练掌握C#中的字符串和正则表达式,能够极大地提升你在处理文本数据时的效率和灵活性。在实际开发中,结合`StringBuilder`类处理大量字符串拼接,以及利用正则表达式的强大功能进行数据验证和清洗,都将使你...

Global site tag (gtag.js) - Google Analytics