首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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章。

参考资料:

关于URI/URL、HTTP和HTML的参考资料,请访问本书的合作站点:http://wicked cooljava.com。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论