﻿<?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-轮上飞-随笔分类-&lt;b&gt;正则表达式&lt;/b&gt;</title><link>http://www.blogjava.net/zhyiwww/category/20765.html</link><description>zhyiwww</description><language>zh-cn</language><lastBuildDate>Thu, 20 Sep 2007 12:31:10 GMT</lastBuildDate><pubDate>Thu, 20 Sep 2007 12:31:10 GMT</pubDate><ttl>60</ttl><item><title>JAVA中使用正则表达式的几个功能</title><link>http://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 19 Sep 2007 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/146550.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/146550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/146550.html</trackback:ping><description><![CDATA[一般的来说，使用正则表达式可以实现四个功能：匹配、分割、替换、删除。<br />严格的来说，其实替换和删除是一个功能，不过，从逻辑功能上来说，是不同的。<br />下面，就是一个简单的demo也实现了上面的几个功能，虽然比较简单，但是，对于不同的需求，都有对应的实现。<br />希望对初学的您也能提供一点思路。<br /><br />package org.zy.demo;<br /><br />import java.io.BufferedInputStream;<br />import java.io.Reader;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />/**<br /> * a testing demo of regular express<br /> * @author zy<br /> *<br /> */<br />public class RegularExpDemo {<br /><br />    public static void main(String[] args) {<br />        RegularExpDemo red = new RegularExpDemo();<br />        red.match();<br />        red.split();<br />        red.replace();<br />        red.delete();<br />    }<br /><br />    /*<br />     * just test match @param parent @param son<br />     */<br />    public void match() {<br />        String parent = "abcdefdssdefdsfed";<br />        String son = "d(ef)";<br />        Pattern p = Pattern.compile(son);<br />        Matcher m = p.matcher(parent);<br /><br />        while (m.find()) {<br />            System.out.println(" start  :  " + m.start());<br />            System.out.println(" end : " + m.end());<br />        }<br /><br />    }<br /><br />    /*<br />     * just test split<br />     */<br />    public void split() {<br />        String parent = "a/b/c/d/e/f/sd/ikshk/alke";<br />        String son = "/";<br />        Pattern p = Pattern.compile(son);<br /><br />        String[] lstr = p.split(parent);<br />        int i = 0;<br />        while (i &lt; lstr.length) {<br />            System.out.println(lstr[i]);<br />            i++;<br />        }<br /><br />    }<br /><br />    /*<br />     * test replace<br />     */<br />    public void replace() {<br /><br />        String parent = "abcdefdssdefdsfed";<br />        String son = "d[e|s].";<br />        Pattern p = Pattern.compile(son);<br />        Matcher m = p.matcher(parent);<br /><br />        String lStr = m.replaceAll("ccgg");<br />        System.out.println(parent);<br />        System.out.println(lStr);<br /><br />    }<br /><br />    /*<br />     * test delete<br />     */<br />    public void delete() {<br /><br />        String parent = "abcdefdssdefdsfed";<br />        String son = "d[e|s].";<br />        Pattern p = Pattern.compile(son);<br />        Matcher m = p.matcher(parent);<br /><br />        String lStr = m.replaceAll("");<br />        System.out.println(parent);<br />        System.out.println(lStr);<br /><br />    }<br />}<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/146550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-09-19 17:40 <a href="http://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式删除空行</title><link>http://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 18 Sep 2007 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/146081.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/146081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/146081.html</trackback:ping><description><![CDATA[
		<p>我们的目标是要删除文本中的空行，可能一行也可能是多行。<br />所以，我的操作如下：<br /><img height="604" alt="reg3.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/reg3.PNG" width="543" border="0" /><br />在此，我们匹配空行用的是<br />(\r\n)*<br />这样，就可以匹配多个空行，同时用null来替代，就可以实现删除空行。此方案是基于对\r和\n的使用。<br /><br />以前在网上看到一种实现是：<br />\n[\s| ]*\r<br />匹配之后，用null替代，也可以实现删除空行，效果如下图：<br /><img height="605" alt="reg4.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/reg4.PNG" width="557" border="0" /><br />两种方案都能实现相同的效果。<br /><br />如果有其他的不同理解，请发表评论，大家共同进步。<br /><br />我又做了以下测试，如下图：<br /><img height="605" alt="reg5.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/reg5.PNG" width="563" border="0" /><br />仅用了<br />\n\r<br />就完全实现了删除所有的空行，因为在每一个空行的开头和结尾都是<br />\n\r<br />所以，删除了上一行之后，当前行还有一个\n\r,同样能够匹配上，所以，还要在做替代操作。这样，就可以删除所有的空行了。<br />那，如果是<br />\r\n，效果如何呢？<br />我又做了一下测试，效果如下图：<br /><img height="603" alt="reg6.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/reg6.PNG" width="728" border="0" /><br />这个就不是我们想要的结果．为什么呢？<br />我想，我们可以这样理解，<br />C:\Program Files\Common Files\Relive.dll  </p>
		<p>C:\Program Files\Common Files\svchost.exe</p>
		<p>C:\Program Files\Internet Explorer\msvcrt.bak <br />C:\Program Files\Internet Explorer\msvcrt.dll </p>
		<p>C:\Program Files\Internet Explorer\msvcrt.ebk</p>
		<p> </p>
		<p>C:\WINNT\system32\drivers\npf.sys<br />C:\WINNT\system32\wpcap.dll<br />C:\WINNT\system32\Packet.dll<br />C:\WINNT\system32\WanPacket.dll</p>
		<p>C:\Documents and Settings\User name\Local Settings\Temp\wmso.exe<br />C:\Documents and Settings\User name\Local Settings\Temp\BCG5.tmp<br /><br />这个是原始文本，其实，在我们进行文本处理的时候，我们可以这样把空行，用<br />\r\n(回车换行，先回车，后换行)<br />来替换掉．文本就是：<br />C:\Program Files\Common Files\Relive.dll\r\n\r\nC:\Program Files\Common Files\svchost.exe\r\n\r\nC:\Program Files\Internet Explorer\msvcrt.bak\r\nC:\Program Files\Internet Explorer\msvcrt.dll\r\n\nC:\Program Files\Internet Explorer\msvcrt.ebk\r\n\r\n\r\n\r\nC:\WINNT\system32\drivers\npf.sys\r\nC:\WINNT\system32\wpcap.dll\r\nC:\WINNT\system32\Packet.dll\r\nC:\WINNT\system32\WanPacket.dll\r\n\r\nC:\Documents and Settings\User name\Local Settings\Temp\wmso.exe\r\nC:\Documents and Settings\User name\Local Settings\Temp\BCG5.tmp\r\n\r\n\r\n<br /><br />这一段文本是一个整体，没有回车，没有空隙和间隔，这是我们正在处理的文本，只不过回车换行是不可见字符，所以就不能看到，但是还是存在的．<br />所以，在处理的时候才会出现我们上面的情况．<br />有此，我们可以理解为什么<br />用\r\n匹配和替代后，<br />所有的\r\n都没有了，所以，文本，就成为了一个连接的纯字符文本了．<br />但是<br />\n\r<br />替换后，<br />中间的所有的\n\r都替代掉了,\r(\n\r……\n\r)\n，中间的部分都替代掉了。所以就剩最后的一个\r\n.<br /><br />以上是我的一点理解。<br /></p>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/146081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-09-18 10:26 <a href="http://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式中的\n和\r</title><link>http://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Mon, 17 Sep 2007 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/145817.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/145817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/145817.html</trackback:ping><description><![CDATA[正则表达式中，我们经常会用到\n和\r，又得时候可能觉得可能功能差不多，但是，用的时候可能发现，有有点不太一样。到底有什么不同呢?确切地说，我也说不清楚。但是，通过下面的例子，我们也许可以看出一点区别。<br />下图是\r的匹配结果：<br /><br /><img height="634" alt="regex1.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/regex1.PNG" width="618" border="0" /> <br /><br />下图是\n的匹配结果：<br /><img height="646" alt="regex2.PNG" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/regex2.PNG" width="550" border="0" /> <br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/145817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-09-17 13:09 <a href="http://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我自己写的测试正则表达式</title><link>http://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 10 Aug 2007 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/135956.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/135956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/135956.html</trackback:ping><description><![CDATA[验证电子邮件 [\w\d]+@([\d\w]+\.)+\w+<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/rg1.JPG" alt="rg1.JPG" border="0" height="520" width="737" /><br /><br />网上看到的一个匹配ip的正则表达式的例子如下：<br />(\d+)\.(\d+)\.(\d+)\.(\d+)<br />匹配结果如下图：<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/ip.JPG" alt="ip.JPG" border="0" height="507" width="638" /><br />显然,上面的那个式子在严格上来说是不能匹配IP地址的。因为，无效的IP地址也能成功匹配，<br />所以，这个式子没有考虑到IP地址的特殊的数字限制。<br />网上有人给了这样一个验证IP的式子：<br />((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)<br />我个人觉得这个还是考虑的比较全的。<br /><br />分析一下下面的正则表达式的不同意义:<br />((de)|(ab))<br />可以匹配的串如下<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/rg2.JPG" alt="rg2.JPG" border="0" height="452" width="569" /><br />也就是说，可以匹配<br />de或者ab,也只能匹配这两个独立的串，如果想匹配de和ab串的组合串，如何处理呢？比如，想匹配abde或者deab等。<br /><br /><br />((de)|(ab))*<br />可以匹配的串如下：<br /><img src="http://www.blogjava.net/images/blogjava_net/zhyiwww/regex/rg3.JPG" alt="rg3.JPG" border="0" height="455" width="572" /><br /><br />由上图我们可以知道，上面的式子可以匹配de和ab的任意顺序组合的字符串。<br />但是前面的那个式子就只能匹配单个的de或者ab.<br />这个就是他们的区别。<br /><br /><br />初学，仅做测试，欢迎交流。<br /><br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/135956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-08-11 00:01 <a href="http://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的匹配</title><link>http://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 10 Aug 2007 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/135786.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/135786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/135786.html</trackback:ping><description><![CDATA[我们要想写好一个表达式，首先就要了解一个表达式能匹配什么。<br />如下<br />[ab]*或者[a|b]*能匹配成什么字符串呢？<br />在此列表如下：<br />a<br />b<br />a……<br />b……<br /><br />ab<br />(ab)……<br />a……b<br />ab……<br /><br />ba<br />b……a<br />ba……<br />(ba)……<br /><br />……表示重复。<br />我想大概可以表示成上面的几种情形。也就是说<br />[ab]*就可以描述由a和b两个字符组成的所有字符串了。<br />可见我们使用正则表达式，可以让我们省去多少的语言语句来描述。<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/135786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-08-10 13:21 <a href="http://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>疑惑：如何用正则表达式来验证日期</title><link>http://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Mon, 19 Mar 2007 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/104687.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/104687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/104687.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">我们要检验的日期格式：XXXX-XX-XX(X为数字)<br /><span lang="EN-US"></span></p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<br />
				</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">[\d]{4}-[\d]{2}-[\d]{2}</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">这个是我看到的一个日期验证的正则表达式。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">看起来能实现，因为</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2006-6-6</span>
				<span style="font-family: 宋体;">肯定是不符合的，而</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2006-06-06</span>
				<span style="font-family: 宋体;">肯定是符合的。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">但是，我们来看，</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2006-00-00</span>
				<span style="font-family: 宋体;">也肯定是符合的，但是，有意义吗？</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2006-99-99</span>
				<span style="font-family: 宋体;">也肯定是符合的，但是，有意义吗？</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">答案，大家都知道，肯定没有意义。所以，我觉得这个表达式还有要改进的地方。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">问题的关键是数值大小的限制，如何来限制？</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">我把它改进了一下：</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">[\d]{4}-[0-1][0-9]-[0-3][0-9]</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">我们乍一看，觉得可行，</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2006-19-39</span>
				<span style="font-family: 宋体;">肯定符合，但是没有意义。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">看来，还是有问题。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">到现在，我也没有想清楚这个看似简单的问题如何来解决。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">如果用这个表达式来检验日期的话，是不行的，还需要你进行数值范围的验证。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;">如果哪位朋友知道的话，请指点一二。谢谢。<br /></span>
		</p>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/104687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-03-19 11:07 <a href="http://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>