2.3 在一个String中查找子串模式
本章前面的“使用正则表达式来搜索文本”一节说明了如何使用regex模式来比较一个String是否匹配(或部分匹配)一个给定的模式。这里,匹配是从输入字符串的第一个字符开始的。在本节中,将使用regex模式在一个String中查找多个匹配值。举例来说,可以在一篇文档中搜索查找嵌入在正文中的任何URL。首先,需要创建一个匹配URL的模式字符串。下面给出一个能匹配大多数URL的模式:
String urlString = "(http|https|ftp)://[/\\w\\.\\-\\+\\?%=&;:,#]+";
|
此模式并不能有效地描述URL,因为它也匹配一些包含错误语法的URL字符串,如http://////////。在一些情况下它也会捕获额外的字符,如可能紧跟在嵌入到正文中的URL之后的逗号或分号。这些字符有时会出现在URL中,但是如果URL出现在正文中,这些字符可能不希望URL的一部分而被捕获。但该模式相对简短并且能够很好地用于搜索文本文件中包含的URL。此模式表达式的各部分如下所示:
● http、https或ftp
● ://
● / 0-9 A-Z a-z _ . - + ? % = & ; : , #中的一个或多个字符
|
我们知道,Matcher可以将一个模式应用到一个特殊的输入字符串。为了使用前面定义的urlString模式查找多个子串匹配,必须调用Matcher的find方法。为了在输入字符串内找到每一个出现的模式,可以重复调用find方法来查找下一个匹配。当没有更多的匹配时,find方法返回false。为了获取当前匹配的位置,可以使用start和end方法来获得索引值以在输入文本中的范围内进行匹配。以下的代码将显示数据内找到的所有URL:
String urlString = "(http|https|ftp)://[/\\w\\.\\-\\+\\?%=&;:,#]+";
Pattern urlPattern = Pattern.compile(urlString);
// get the data (somehow)
String data = getStringData();
// get a matcher for the data
Matcher urlMatcher = urlPattern.matcher(data);
// iterate through the matches
while (urlMatcher.find()) {
int startIndex = urlMatcher.start(); // index of start
int endIndex = urlMatcher.end(); // index of end + 1
// retrieve the matching substring
String currentMatch = data.substring(startIndex, endIndex);
System.out.println(currentMatch);
}
|
此代码将不能匹配相对的URL(如/images/picture.jpg),这些URL常常出现在HTML文件或省略前置http://的不完整的URL(如wickedcooljava.com)中。为了知道何时应该将某字符串作为相对URL来对待,程序必须理解HTML文件的结构(使用regex也可完成此任务,但是要更困难些)。需要知道每个匹配的上下文,为此必须在理解其语法的基础上分析文件。若想了解更多的信息,请参考第3章。
posted on 2008-12-09 09:29
♂游泳的鱼 阅读(423)
评论(1) 编辑 收藏