﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-程序人生</title><link>http://www.blogjava.net/yydy1983/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 17:59:04 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 17:59:04 GMT</pubDate><ttl>60</ttl><item><title>[JS]jQuery中attr和prop方法的区别</title><link>http://www.blogjava.net/yydy1983/archive/2015/01/21/422322.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Wed, 21 Jan 2015 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2015/01/21/422322.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/422322.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2015/01/21/422322.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/422322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/422322.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 相比attr，prop是1.6.1才新出来的，两者从中文意思理解，都是获取/设置属性的方法（attributes和properties）<br><a  href="http://www.itmmd.com/201501/519.html" >jQuery教程(29)-jQuery插件开发之为插件方法指定参数</a><br><a  href="http://www.itmmd.com/201501/518.html" >jQuery教程(28)-jQuery插件开发之使用插件</a><br><a  href="http://www.itmmd.com/201501/515.html" >jQuery教程(27)-jQueryajax操作之修改默认选项</a><br><a  href="http://www.itmmd.com/201501/512.html" >jQuery教程(26)-ajax操作之使用JSONP加载远程数据</a>&nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2015/01/21/422322.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/422322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2015-01-21 14:33 <a href="http://www.blogjava.net/yydy1983/archive/2015/01/21/422322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android官方技术文档翻译—— Eclilpse项目迁移</title><link>http://www.blogjava.net/yydy1983/archive/2015/01/14/422223.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Wed, 14 Jan 2015 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2015/01/14/422223.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/422223.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2015/01/14/422223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/422223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/422223.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 其实一直想写一篇关于Context的文章，但是又怕技术不如而误人子弟，于是参考了些资料，今天准备整理下写出来，如有不足，请指出，参考资料会在醒目地方标明。<br><a  href="http://www.itmmd.com/201501/469.html" >android学习笔记（41）android选项菜单和子菜单（SubMenu )</a><br><a  href="http://www.itmmd.com/201501/464.html" >android学习笔记（40）Notification的功能与用法</a><br><a  href="http://www.itmmd.com/201501/475.html" >android学习笔记（42）android使用监听器来监听菜单事件</a><br><a  href="http://www.itmmd.com/201501/476.html" >android学习笔记（43）android创建单选菜单和复选菜单</a>&nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2015/01/14/422223.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/422223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2015-01-14 13:31 <a href="http://www.blogjava.net/yydy1983/archive/2015/01/14/422223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java获取当前路径和读取文件</title><link>http://www.blogjava.net/yydy1983/archive/2015/01/06/422074.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Tue, 06 Jan 2015 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2015/01/06/422074.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/422074.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2015/01/06/422074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/422074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/422074.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、利用System.getProperty()函数获取当前路径：<br>System.out.println(System.getProperty("user.dir"));//user.dir指定了当前的路径<br><a href="http://www.itmmd.com/mobile.html">android开发</a>&nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2015/01/06/422074.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/422074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2015-01-06 13:39 <a href="http://www.blogjava.net/yydy1983/archive/2015/01/06/422074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android Context 上下文 你必须知道的一切</title><link>http://www.blogjava.net/yydy1983/archive/2015/01/05/422056.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Mon, 05 Jan 2015 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2015/01/05/422056.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/422056.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2015/01/05/422056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/422056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/422056.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 其实一直想写一篇关于Context的文章，但是又怕技术不如而误人子弟，于是参考了些资料，今天准备整理下写出来，如有不足，请指出，参考资料会在醒目地方标明。<br><a  href="http://www.itmmd.com/201501/439.html" >Android KSOAP2调用.net webservice</a><br><a  href="http://www.itmmd.com/201501/437.html" >jQuery教程(8)-DOM树操作之使用反向插入方法</a><br><a  href="http://www.itmmd.com/201501/436.html" >android学习笔记（34）使用AlertDialog创建简单对话框</a><br><a  href="http://www.itmmd.com/201501/435.html" >android学习笔记（33）画廊视图（Gallery)的功能和用法</a><br><a  href="http://www.itmmd.com/201501/434.html" >android na&nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2015/01/05/422056.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/422056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2015-01-05 13:40 <a href="http://www.blogjava.net/yydy1983/archive/2015/01/05/422056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript技术难点（三）之this、new、apply和call详解</title><link>http://www.blogjava.net/yydy1983/archive/2014/12/09/421229.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Tue, 09 Dec 2014 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2014/12/09/421229.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/421229.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2014/12/09/421229.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/421229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/421229.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: this、new、call和apply的相关问题<br>　　讲解this指针的原理是个很复杂的问题，如果我们从javascript里this的实现机制来说明this，很多朋友可能会越来越糊涂<br>by:<a href="http://www.itmmd.com">萌萌的it人</a><br>更多关于 <a href="http://www.itmmd.com/mobile.html">android开发</a> 的文章&nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2014/12/09/421229.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/421229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2014-12-09 17:54 <a href="http://www.blogjava.net/yydy1983/archive/2014/12/09/421229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式和grep命令的用法</title><link>http://www.blogjava.net/yydy1983/archive/2014/11/27/420790.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Thu, 27 Nov 2014 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/archive/2014/11/27/420790.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/420790.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/archive/2014/11/27/420790.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/420790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/420790.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 正则表达式（或称Regular Expression，简称RE）就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。<br><br><a href="http://www.itmmd.com">萌萌的it人</a> &nbsp;&nbsp;<a href='http://www.blogjava.net/yydy1983/archive/2014/11/27/420790.html'>阅读全文</a><img src ="http://www.blogjava.net/yydy1983/aggbug/420790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2014-11-27 17:43 <a href="http://www.blogjava.net/yydy1983/archive/2014/11/27/420790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.5 使用正则表达式进行替换</title><link>http://www.blogjava.net/yydy1983/articles/246997.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Wed, 17 Dec 2008 17:01:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/articles/246997.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/246997.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/articles/246997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/246997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/246997.html</trackback:ping><description><![CDATA[<p><strong>2.5&nbsp; 使用正则表达式进行替换</strong> <br />
<br />
在上一节中，介绍了用于匹配一个String中的模式和用于从一个子模式组中检索数据的正则表达式。使用regex，还可以用新的值替代匹配的模式。完成此操作的一种方法是使用Matcher类的replaceAll方法，它将返回一个字符串，将所有匹配的子串替换为给定的字符串。为了说明此方法，查找一个文件内出现的所有repetition单词并使用单词duplication来替换它们：
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = getStringData();<br />
            Pattern repPattern = Pattern.compile("(<a href="file://s)(repetition)(%5B//s;//">\\s)(repetition)([\\s;\\</a>.,])");<br />
            Matcher repMatcher = repPattern.matcher(data);<br />
            String newData = repMatcher.replaceAll("$1duplication$3");  </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>为了查找单词，需要捕获它前后的空白(或标点符号)。需要注意的是，如果此单词出现在data字符串的开头，那么上述的代码不会匹配它，因为已假定它的前后存在空白符。除了单词repetition被替换外，我们希望文本中的其他内容与原始文本保持一致，包括单词周围的空白字符。这里的美元符号($)显然不表示货币。它表示对从regex模式中捕获的组1和组3的逆向引用，包含最初匹配的空白或标点符号。这样，与它们对应的值将插入到替换文本中。</p>
<p>String类(在JDK 1.4或更高的版本中)有一个replaceAll方法，其工作机制类似于Matcher中的replaceAll方法。这使得它可以很方便地替换一个与模式匹配的子串：<br />
</p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = getStringData();<br />
            String result =<br />
            data.replaceAll("(<a href="file://s)(repetition)(%5B//s;//">\\s)(repetition)([\\s;\\</a>.,])", "$1duplication$3");    </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>replaceAll方法返回一个新的字符串，其中所有匹配的部分已被新值替换。但是，使用Matcher仍有很多优点，因为相对于字符串它有更大的灵活性。</p>
<p>可以使用Matcher的find循环用新值依次替换每个匹配的部分。这样使你能够更好地控制替换过程。比如，可以在每次匹配的过程中应用其他逻辑，甚至每次可以替换不同的值。这就用到了StringBuffer，StringBuffer用于保存更新的文本，并且一旦调用appendReplacement方法，Matcher就追加更新后的文本到缓存中。在处理每个匹配并执行替换后，需要使用appendTail方法将最后一次匹配后的剩余字符串放置在输出缓存中。图2-1说明了子串匹配和这两种方法之间的关系。<br />
</p>
<table class="ln" cellspacing="0" bordercolordark="#ffffff" align="center" bgcolor="#ddddd" bordercolorlight="#999999" border="1">
    <tbody>
        <tr>
            <td bgcolor="#ffffff"><a href="http://new.51cto.com/files/uploadimg/20071108/134652727.gif" target="_blank"><img class="fit-image" onmousewheel="javascript:return big(this)" style="zoom: 120%" height="179" alt="" src="http://new.51cto.com/files/uploadimg/20071108/134652727.gif" width="486" onload="javascript:if(this.width />498)this.style.width=498;" border=0></a><a href="http://book.51cto.com/files/uploadimg/20060921/153223104.gif" target="_blank"></a></td>
        </tr>
        <tr>
            <td class="it" align="center" bgcolor="#dddddd">图2-1&nbsp; Matcher类的append方法&nbsp;</td>
        </tr>
    </tbody>
</table>
Matcher有一个相应的append指针。指针最初从零开始，随着每次调用appendReplacement向前移动。这种设计是为了在一个find循环内使用它。每次匹配后，调用appendReplacement方法，Matcher将指针所在的上一个位置到匹配之前指针所在的位置之间的内容，即未更改的文本合并到StringBuffer中。然后，Matcher替换当前匹配的文本并将替换后的内容放置在StringBuffer中。接下来，Matcher将append指针移动到当前匹配结尾之后的第一个字符，然后重复此过程直到不再产生匹配。在找到所有匹配之后很可能剩下一个未匹配的部分。为了将这部分文本添加到输出StringBuffer中，使用appendTail方法。<br />
现在使用这些方法将前面的替换例子重写为一个循环。但是这一次对于每个匹配，将使用一个随机选择的同义词(repetition、duplication、copying、reiteration、recurrence或redundancy)来替代单词repetition：
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>StringBuffer result = new StringBuffer();<br />
            String[] wordChoices = new String[]<br />
            {"repetition", "duplication", "copying",<br />
            "reiteration", "recurrence", "redundancy"};<br />
            Random rand = new Random();<br />
            String data = getStringData();<br />
            Pattern repPattern = Pattern.compile("(<a href="file://s)(repetition)(%5B//s;//">\\s)(repetition)([\\s;\\</a>.,])");<br />
            Matcher repMatcher = repPattern.matcher(data);<br />
            while (repMatcher.find()) {<br />
            // pick a word at random<br />
            int wordIndex = rand.nextInt(wordChoices.length);<br />
            String replacement = "$1" + wordChoices[wordIndex] + "$3";<br />
            repMatcher.appendReplacement(result, replacement);<br />
            }<br />
            repMatcher.appendTail(result);<br />
            System.out.println(result);   </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
可以按需求改写find循环中的逻辑来对每个匹配进行所需的处理。此外，还可以使用前面讨论过的Matcher的方法：group、start和end。可以使用这些技术的组合有选择地修改或删除一个文件中每部分匹配的文本。
<img src ="http://www.blogjava.net/yydy1983/aggbug/246997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2008-12-18 01:01 <a href="http://www.blogjava.net/yydy1983/articles/246997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.4 使用Regex捕获组</title><link>http://www.blogjava.net/yydy1983/articles/245894.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Fri, 12 Dec 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/articles/245894.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/245894.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/articles/245894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/245894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/245894.html</trackback:ping><description><![CDATA[<p><strong>2.4&nbsp; 使用Regex捕获组 <br />
</strong>&nbsp;<br />
在上一节中，介绍了如何使用正则表达式在一个文件中进行搜索以便检索它内部所有的URL。可以使用Matcher类的find、start和end方法来检索匹配的URL字符串。有时有必要进一步处理子串匹配的结果，或是查找附加的子模式。例如，对某个特定区域的URL不进行处理。为了实现此目的，一种强制性的方法是使用另一个Pattern和Matcher对象，代码如下：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>// assume urlMatcher instance as in the previous example<br />
            while (urlMatcher.find()) {<br />
            int startIndex = urlMatcher.start();<br />
            int endIndex = urlMatcher.end();<br />
            String currentMatch = data.substring(startIndex, endIndex);<br />
            // the brute force approach, using a new pattern!<br />
            Pattern restricted = Pattern.compile(".*(abc|cbs|nbc)\\.com.*");<br />
            Matcher restrictMatcher = restricted.matcher(currentMatch);<br />
            if (!restrictMatcher.matches()) {<br />
            System.out.println(currentMatch);<br />
            }<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
在捕获的URL中匹配域名并不是一个非常高效的方法。由于已经使用find方法完成了提取URL的困难工作，不应该仅仅为了获得结果的一部分而编写另一个regex，并且也不必这样做。正则表达式允许将模式分解成子序列。使用圆括号，将以后要用到的模式部分括起来，这样，我们就可以忽略其余部分单独读取这些部分的值。重写URL模式以使域名可以与URL的其他部分相分离：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String urlPattern =<br />
            "(http|https|ftp)://([a-zA-Z0-9-\\.]+)[/\\w\\.\\-\\+\\?%=&amp;;:,#]*";</pre>
            </td>
        </tr>
    </tbody>
</table>
当在模式中存在用括号括起来的组时，可以分别检索每个组的匹配值。从最左边的组开始编为1，然后依次对每对括号相对应的组进行编号。在上面的模式中，第一组是协议(如http)，第二组是域名。为了在匹配的字符串中访问组，可以使用Matcher的group方法。下面的代码示例从每个URL中检索域名并显示它们的值：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = getStringData(); // load the document<br />
            String urlString =<br />
            "(http|https|ftp)://([a-zA-Z0-9-\\.]+)[/\\w\\.\\-\\+\\?%=&amp;;:,#]*";<br />
            Pattern urlPattern = Pattern.compile(urlString);<br />
            Matcher urlMatcher = urlPattern.matcher(data);<br />
            // print out the domain from each URL<br />
            while (urlMatcher.find()) {<br />
            String domain = urlMatcher.group(2); // 2nd group is the domain<br />
            System.out.println(domain);<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>保存每个匹配的组以便可以随后引用它们。在一个模式内引用一个以前的匹配组称为逆向引用(backreference)。为了对第三个组进行逆向引用，在模式中包括\3即可。这将会只匹配一个与以前的组相匹配的严格重复的数据。为了说明此问题，考虑一个在文本文件中常见的错误—— 一个句子中意外地重复出现某个常用的单词，如&#8220;the&#8221;或&#8220;of&#8221;。</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>" The the water molecules are made of of hydrogen and oxygen."</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>下面编写一个模式来找出文件中存在的这些问题。该模式将捕获第一个单词，后跟一些空白符，而其后又跟着匹配第一个单词的重复模式：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String wordPattern = "<a href="file://s(of%7Cor%7Cthe%7Cto)//s+//1%5B//s//">\\s(of|or|the|to)\\s+\\1[\\s\\</a>.,;]";<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
该模式匹配情况如下：一个空白字符、特殊的单词列表中的一个单词、更多的空白、再次重复的相同的单词(使用\1逆向引用)以及空白符或标点符号。这种匹配应不区分大小写，以便能够捕获到&#8220;The the&#8221;以及类似的变型。如以下的代码段所示，该模式不区分大小写，能在一个字符串中查找重复出现的模式：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = getStringData();<br />
            String patternStr = "<a href="file://s(of%7Cor%7Cthe%7Cto)//s+//1%5B//s//">\\s(of|or|the|to)\\s+\\1[\\s\\</a>.,;]";<br />
            Pattern wordPattern =<br />
            Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);<br />
            Matcher wordMatcher = wordPattern.matcher(data);<br />
            while (wordMatcher.find()) {<br />
            int start = wordMatcher.start();<br />
            String word = wordMatcher.group(1);<br />
            // print the index location of the repeated word<br />
            System.out.println("Repeated " + word + " starting at " + start);<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>有一种简便和强大的匹配文件中文本的方法，该方法允许使用多个正则表达式来处理文件，本章后面的&#8220;使用Scanner类进行语法分析&#8221;一节将会讲解此方法。若想了解使用内置索引进行更为复杂的文本搜索的解决方法，请参考第3章中&#8220;使用Lucene进行搜索&#8221;一节的内容。</p>
<img src ="http://www.blogjava.net/yydy1983/aggbug/245894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2008-12-12 11:38 <a href="http://www.blogjava.net/yydy1983/articles/245894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.3 在一个String中查找子串模式</title><link>http://www.blogjava.net/yydy1983/articles/245145.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Tue, 09 Dec 2008 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/articles/245145.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/245145.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/articles/245145.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/245145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/245145.html</trackback:ping><description><![CDATA[<p><strong>2.3&nbsp; 在一个String中查找子串模式</strong> <br />
<br />
本章前面的&#8220;使用正则表达式来搜索文本&#8221;一节说明了如何使用regex模式来比较一个String是否匹配(或部分匹配)一个给定的模式。这里，匹配是从输入字符串的第一个字符开始的。在本节中，将使用regex模式在一个String中查找多个匹配值。举例来说，可以在一篇文档中搜索查找嵌入在正文中的任何URL。首先，需要创建一个匹配URL的模式字符串。下面给出一个能匹配大多数URL的模式： </p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String urlString = "(http|https|ftp)://[/\\w\\.\\-\\+\\?%=&amp;;:,#]+";</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>此模式并不能有效地描述URL，因为它也匹配一些包含错误语法的URL字符串，如<a href="http://////////">http://////////</a>。在一些情况下它也会捕获额外的字符，如可能紧跟在嵌入到正文中的URL之后的逗号或分号。这些字符有时会出现在URL中，但是如果URL出现在正文中，这些字符可能不希望URL的一部分而被捕获。但该模式相对简短并且能够很好地用于搜索文本文件中包含的URL。此模式表达式的各部分如下所示： </p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>●&nbsp;&nbsp;http、https或ftp <br />
            ●&nbsp;&nbsp;:// <br />
            ●&nbsp;/ 0-9 A-Z a-z _ . - + ? % = &amp; ; : , #中的一个或多个字符 </pre>
            </td>
        </tr>
    </tbody>
</table>
我们知道，Matcher可以将一个模式应用到一个特殊的输入字符串。为了使用前面定义的urlString模式查找多个子串匹配，必须调用Matcher的find方法。为了在输入字符串内找到每一个出现的模式，可以重复调用find方法来查找下一个匹配。当没有更多的匹配时，find方法返回false。为了获取当前匹配的位置，可以使用start和end方法来获得索引值以在输入文本中的范围内进行匹配。以下的代码将显示数据内找到的所有URL：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String urlString = "(http|https|ftp)://[/\\w\\.\\-\\+\\?%=&amp;;:,#]+";<br />
            Pattern urlPattern = Pattern.compile(urlString);<br />
            // get the data (somehow)<br />
            String data = getStringData();<br />
            // get a matcher for the data<br />
            Matcher urlMatcher = urlPattern.matcher(data);<br />
            // iterate through the matches<br />
            while (urlMatcher.find()) {<br />
            int startIndex = urlMatcher.start(); &nbsp;&nbsp;// index of start<br />
            int endIndex = urlMatcher.end(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// index of end + 1<br />
            // retrieve the matching substring<br />
            String currentMatch = data.substring(startIndex, endIndex);<br />
            System.out.println(currentMatch);<br />
            }</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>此代码将不能匹配相对的URL(如/images/picture.jpg)，这些URL常常出现在HTML文件或省略前置http://的不完整的URL(如wickedcooljava.com)中。为了知道何时应该将某字符串作为相对URL来对待，程序必须理解HTML文件的结构(使用regex也可完成此任务，但是要更困难些)。需要知道每个匹配的上下文，为此必须在理解其语法的基础上分析文件。若想了解更多的信息，请参考第3章。</p>
<img src ="http://www.blogjava.net/yydy1983/aggbug/245145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2008-12-09 09:29 <a href="http://www.blogjava.net/yydy1983/articles/245145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.2 使用String.split方法</title><link>http://www.blogjava.net/yydy1983/articles/244849.html</link><dc:creator>♂游泳的鱼</dc:creator><author>♂游泳的鱼</author><pubDate>Sun, 07 Dec 2008 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/yydy1983/articles/244849.html</guid><wfw:comment>http://www.blogjava.net/yydy1983/comments/244849.html</wfw:comment><comments>http://www.blogjava.net/yydy1983/articles/244849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yydy1983/comments/commentRss/244849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yydy1983/services/trackbacks/244849.html</trackback:ping><description><![CDATA[<p><strong>2.2&nbsp; 使用String.split方法 <br />
</strong>&nbsp;<br />
开发人员有时需要使用分隔符(如逗号、制表符或空格)将一个String分割成子串。正如上一节中讨论的那样，Java 1.4添加了Pattern类用来和常规表达式来执行文本比较。除了模式匹配外，用常规表达式作为分隔符，Pattern对象可以将一个String分割成一个子串数组。例如，可以使用逗号作为模式将一行以逗号分隔的列表划分成一个字符串数组：</p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = "Australia,Fiji,New Zealand,Papua New Guinea";<br />
            Pattern comma = Pattern.compile(",");<br />
            String[] countries = comma.split(data);</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>分割字符串更简单的实现方法是：使用String类中的split方法。使用此方法重写以上代码。这一次将更改分隔符以包括逗号前后的所有空白，以使它不成为子串值的一部分：
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>String data = "Australia, Fiji, New Zealand , Papua New Guinea";<br />
            String[] countries = data.split("<a href="file://s*,//s">\\s*,\\s</a>*");</pre>
            </td>
        </tr>
    </tbody>
</table>
正如前面介绍过的Pattern对象那样，在这里同样可以采用相同的正则表达式语法。因此使用split方法的场合远不止逗号和空格。</p>
<img src ="http://www.blogjava.net/yydy1983/aggbug/244849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yydy1983/" target="_blank">♂游泳的鱼</a> 2008-12-07 12:07 <a href="http://www.blogjava.net/yydy1983/articles/244849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>