posts - 8,  comments - 6,  trackbacks - 0

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 ♂游泳的鱼 阅读(418) 评论(1)  编辑  收藏

FeedBack:
# re: 2.3 在一个String中查找子串模式
2014-12-09 15:03 | 猎头招聘
在一个String中查找子串模式看了好几篇还是不太懂,看来要回去看第三章。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2014年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜