Java正则表达式(一)
正则表达式在处理文本方面用处非常大,最早像在Perl和awk语言中,提供了这种机制,Java在Java 2中也增加了正则表达式这个包java.util.regex。这个包为用户使用正则表达式,提供了易用而全面的支持。我的研究方向是web挖掘。从网页中提取内容,处理文本,当然需要正则表达式这个强大的工具了。Java代码
- 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,我们以后会专门讨论着连个类。现在主要看看使用正则表达式的流程:Java代码
- Pattern?p?=?Pattern.compile(regex);??
然后调用Pattern的方法matcherJava代码
- Matcher?m?=?p.matcher(candidate);??
得到了Matcher对象,Matcher对象保存了许多匹配信息,然后可以通过find()方法Java代码
- String?regex?=?"\\ba\\w*\\b";??
这个就是一个正则表达式,b,w,*都是正则表达式的meta character原字符,Java代码
- static?Pattern?compile(String?regex)???
将给定的正则表达式编译到模式中,并创建Pattern对象,这个方法通常是操作正则表达式的第一步,从前面那个例子Java代码
- ???
- static?Pattern?compile(String?regex,?int?flags)???
将给定的正则表达式编译到具有给定标志的模式中。 这个方法参数flags提供了一些特殊的选项来用于特殊的处理,Java代码
- Pattern?p?=Pattern.compile("A????#matches?uppercase?US-ASCII?char?code?65",Pattern.COMMENTS);??
MULTILINE:表明要输入多行,他们有自己的终止字符。Java代码
- Pattern?p?=?Pattern.compile("^",?Pattern.MULTILINE);??
如果你的输入的字符串是:This is a sentence.\n So is this..Java代码
- Pattern?p?=?Pattern.compile(".",?Pattern.DOTALL);??
如果我们输入的是Test\n,则匹配的字符是5个。Java代码
- Pattern?p?=??
- Pattern.compile("t?#?a?compound?flag?example",Pattern.CASE_INSENSITIVE?|?Pattern.UNICODE_CASE|??
- Pattern.COMMENT);??
我们还要注意点的时Java对转译字符\的处理,例如我们要匹配一个数字:Java代码
- Pattern?p?=?Pattern.compile("\d");??
而是:Java代码
- Pattern?p?=?Pattern.compile("\\d");??
另外如果regex本身形式是错误的,compile方法会抛出java.util.regex.PatternSyntaxException异常。Java代码
- public?int?flags()??
这个方法返回了我们前面可以设置的并且已经设置的flags选项,我们通过按位与来判断是否设置了某个选项:Java代码
- int?flgs?=?myPattern.flags();??
- boolean?isUsingCommentFlag?=(?Pattern.COMMENTS?==?(Pattern.COMMENTS?&?flgs))?;??
看看一个简化过程的方法:Java代码
- public?static?boolean?matches?(String?regex,CharSequence?input)??
这个方法实际上是:Java代码
- Pattern?p?=?Pattern.compile(regex);??
- Matcher?m?=?p.matcher(candidate);??
- m.matches()??
过程的一个简化,我们在后面总结Matcher中的matches方法之后就会理解这个了。Java代码
- Pattern?p?=?new?Pattern.compile(",|and");??
- String?fruits[]?=?p.split("apple,banana?and?orange");??
split的一个重载的版本:Java代码
- public?String[]?split(CharSequence?input,?int?limit)??
它指定了划分的组数,有以下三种情况:Java代码
- 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<0Java代码
- Pattern?p?=?Pattern.compile(",");??
- String?temp[]?=?p.split("Hello,Dolly,",?-1);??
- //temp[]={"Hello","Dolly",""}??
下次再总结Matcher类,和正则表达式的一些高级部分
?
转载自: http://fuliang.iteye.com/blog/169946