读书人

Java正则表达式(1)

发布时间: 2012-07-20 10:38:30 作者: rapoo

Java正则表达式(一)

正则表达式在处理文本方面用处非常大,最早像在Perl和awk语言中,提供了这种机制,Java在Java 2中也增加了正则表达式这个包java.util.regex。这个包为用户使用正则表达式,提供了易用而全面的支持。我的研究方向是web挖掘。从网页中提取内容,处理文本,当然需要正则表达式这个强大的工具了。Java代码

  1. import?java.util.regex.*;??
  2. ??
  3. public?class?FindA{??
  4. ??public?static?void?main(String?args[])??
  5. ??throws?Exception{??
  6. ??
  7. ????String?candidate?=??
  8. ?????"A?Matcher?examines?the?results?of?applying?a?pattern.";??
  9. ????String?regex?=?"\\ba\\w*\\b";??
  10. ????Pattern?p?=?Pattern.compile(regex);??
  11. ????Matcher?m?=?p.matcher(candidate);??
  12. ????String?val?=?null;??
  13. ????System.out.println("INPUT:?"?+?candidate);??
  14. ????System.out.println("REGEX:?"?+?regex?+"\r\n");??
  15. ????while?(m.find()){??
  16. ??????val?=?m.group();??
  17. ??????System.out.println("MATCH:?"?+?val);??
  18. ????}??
  19. ????if?(val?==?null)?{??
  20. ??????System.out.println("NO?MATCHES:?");??
  21. ????}??
  22. ??}??
  23. }??

从这个例子我们可以看到正则表达式涉及到的两个类Matcher和Pattern,我们以后会专门讨论着连个类。现在主要看看使用正则表达式的流程:Java代码
  1. Pattern?p?=?Pattern.compile(regex);??

然后调用Pattern的方法matcherJava代码
  1. Matcher?m?=?p.matcher(candidate);??

得到了Matcher对象,Matcher对象保存了许多匹配信息,然后可以通过find()方法Java代码
  1. String?regex?=?"\\ba\\w*\\b";??

这个就是一个正则表达式,b,w,*都是正则表达式的meta character原字符,Java代码
  1. static?Pattern?compile(String?regex)???

将给定的正则表达式编译到模式中,并创建Pattern对象,这个方法通常是操作正则表达式的第一步,从前面那个例子Java代码
  1. ???
  2. static?Pattern?compile(String?regex,?int?flags)???

将给定的正则表达式编译到具有给定标志的模式中。 这个方法参数flags提供了一些特殊的选项来用于特殊的处理,Java代码
  1. Pattern?p?=Pattern.compile("A????#matches?uppercase?US-ASCII?char?code?65",Pattern.COMMENTS);??

MULTILINE:表明要输入多行,他们有自己的终止字符。Java代码
  1. Pattern?p?=?Pattern.compile("^",?Pattern.MULTILINE);??

如果你的输入的字符串是:This is a sentence.\n So is this..Java代码
  1. Pattern?p?=?Pattern.compile(".",?Pattern.DOTALL);??

如果我们输入的是Test\n,则匹配的字符是5个。Java代码
  1. Pattern?p?=??
  2. Pattern.compile("t?#?a?compound?flag?example",Pattern.CASE_INSENSITIVE?|?Pattern.UNICODE_CASE|??
  3. Pattern.COMMENT);??

我们还要注意点的时Java对转译字符\的处理,例如我们要匹配一个数字:Java代码
  1. Pattern?p?=?Pattern.compile("\d");??

而是:Java代码
  1. Pattern?p?=?Pattern.compile("\\d");??

另外如果regex本身形式是错误的,compile方法会抛出java.util.regex.PatternSyntaxException异常。Java代码
  1. public?int?flags()??

这个方法返回了我们前面可以设置的并且已经设置的flags选项,我们通过按位与来判断是否设置了某个选项:Java代码
  1. int?flgs?=?myPattern.flags();??
  2. boolean?isUsingCommentFlag?=(?Pattern.COMMENTS?==?(Pattern.COMMENTS?&?flgs))?;??

看看一个简化过程的方法:Java代码
  1. public?static?boolean?matches?(String?regex,CharSequence?input)??

这个方法实际上是:Java代码
  1. Pattern?p?=?Pattern.compile(regex);??
  2. Matcher?m?=?p.matcher(candidate);??
  3. m.matches()??

过程的一个简化,我们在后面总结Matcher中的matches方法之后就会理解这个了。Java代码
  1. Pattern?p?=?new?Pattern.compile(",|and");??
  2. String?fruits[]?=?p.split("apple,banana?and?orange");??

split的一个重载的版本:Java代码
  1. public?String[]?split(CharSequence?input,?int?limit)??

它指定了划分的组数,有以下三种情况:Java代码
  1. String[]?tmp?=?pattern.split("Hello,?Dolly,?You,?Are,?My,?Favorite",3);??
  2. //tmp[0]?is??"Hello",??
  3. //?tmp[1]?is?"Dolly";??
  4. //tmp[2]?is??"You,?Are,?My,?Favorite";??

limit<0Java代码
  1. Pattern?p?=?Pattern.compile(",");??
  2. String?temp[]?=?p.split("Hello,Dolly,",?-1);??
  3. //temp[]={"Hello","Dolly",""}??


下次再总结Matcher类,和正则表达式的一些高级部分

?

转载自: http://fuliang.iteye.com/blog/169946

读书人网 >软件开发

热点推荐