blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/zhyiwww/category/20765.htmlzhyiwwwzh-cnthu, 20 sep 2007 12:31:10 gmtthu, 20 sep 2007 12:31:10 gmt60java中使用正则表达式的几个功能http://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.htmlzhyiwwwzhyiwwwwed, 19 sep 2007 09:40:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.htmlhttp://www.blogjava.net/zhyiwww/comments/146550.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/09/19/146550.html#feedback0http://www.blogjava.net/zhyiwww/comments/commentrss/146550.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/146550.html严格的来说,其实替换和删除是一个功能,不过,从逻辑功能上来说,是不同的。
下面,就是一个简单的demo也实现了上面的几个功能,虽然比较简单,但是,对于不同的需求,都有对应的实现。
希望对初学的您也能提供一点思路。

package org.zy.demo;

import java.io.bufferedinputstream;
import java.io.reader;
import java.util.regex.matcher;
import java.util.regex.pattern;

/**
 * a testing demo of regular express
 * @author zy
 *
 */
public class regularexpdemo {

    public static void main(string[] args) {
        regularexpdemo red = new regularexpdemo();
        red.match();
        red.split();
        red.replace();
        red.delete();
    }

    /*
     * just test match @param parent @param son
     */
    public void match() {
        string parent = "abcdefdssdefdsfed";
        string son = "d(ef)";
        pattern p = pattern.compile(son);
        matcher m = p.matcher(parent);

        while (m.find()) {
            system.out.println(" start  :  " m.start());
            system.out.println(" end : " m.end());
        }

    }

    /*
     * just test split
     */
    public void split() {
        string parent = "a/b/c/d/e/f/sd/ikshk/alke";
        string son = "/";
        pattern p = pattern.compile(son);

        string[] lstr = p.split(parent);
        int i = 0;
        while (i < lstr.length) {
            system.out.println(lstr[i]);
            i ;
        }

    }

    /*
     * test replace
     */
    public void replace() {

        string parent = "abcdefdssdefdsfed";
        string son = "d[e|s].";
        pattern p = pattern.compile(son);
        matcher m = p.matcher(parent);

        string lstr = m.replaceall("ccgg");
        system.out.println(parent);
        system.out.println(lstr);

    }

    /*
     * test delete
     */
    public void delete() {

        string parent = "abcdefdssdefdsfed";
        string son = "d[e|s].";
        pattern p = pattern.compile(son);
        matcher m = p.matcher(parent);

        string lstr = m.replaceall("");
        system.out.println(parent);
        system.out.println(lstr);

    }
}



zhyiwww 2007-09-19 17:40
]]>
正则表达式删除空行http://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.htmlzhyiwwwzhyiwwwtue, 18 sep 2007 02:26:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.htmlhttp://www.blogjava.net/zhyiwww/comments/146081.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/09/18/146081.html#feedback0http://www.blogjava.net/zhyiwww/comments/commentrss/146081.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/146081.html我们的目标是要删除文本中的空行,可能一行也可能是多行。
所以,我的操作如下:
reg3.png
在此,我们匹配空行用的是
(\r\n)*
这样,就可以匹配多个空行,同时用null来替代,就可以实现删除空行。此方案是基于对\r和\n的使用。

以前在网上看到一种实现是:
\n[\s| ]*\r
匹配之后,用null替代,也可以实现删除空行,效果如下图:
reg4.png
两种方案都能实现相同的效果。

如果有其他的不同理解,请发表评论,大家共同进步。

我又做了以下测试,如下图:
reg5.png
仅用了
\n\r
就完全实现了删除所有的空行,因为在每一个空行的开头和结尾都是
\n\r
所以,删除了上一行之后,当前行还有一个\n\r,同样能够匹配上,所以,还要在做替代操作。这样,就可以删除所有的空行了。
那,如果是
\r\n,效果如何呢?
我又做了一下测试,效果如下图:
reg6.png
这个就不是我们想要的结果.为什么呢?
我想,我们可以这样理解,
c:\program files\common files\relive.dll 

c:\program files\common files\svchost.exe

c:\program files\internet explorer\msvcrt.bak
c:\program files\internet explorer\msvcrt.dll

c:\program files\internet explorer\msvcrt.ebk

 

c:\winnt\system32\drivers\npf.sys
c:\winnt\system32\wpcap.dll
c:\winnt\system32\packet.dll
c:\winnt\system32\wanpacket.dll

c:\documents and settings\user name\local settings\temp\wmso.exe
c:\documents and settings\user name\local settings\temp\bcg5.tmp

这个是原始文本,其实,在我们进行文本处理的时候,我们可以这样把空行,用
\r\n(回车换行,先回车,后换行)
来替换掉.文本就是:
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

这一段文本是一个整体,没有回车,没有空隙和间隔,这是我们正在处理的文本,只不过回车换行是不可见字符,所以就不能看到,但是还是存在的.
所以,在处理的时候才会出现我们上面的情况.
有此,我们可以理解为什么
用\r\n匹配和替代后,
所有的\r\n都没有了,所以,文本,就成为了一个连接的纯字符文本了.
但是
\n\r
替换后,
中间的所有的\n\r都替代掉了,\r(\n\r……\n\r)\n,中间的部分都替代掉了。所以就剩最后的一个\r\n.

以上是我的一点理解。



zhyiwww 2007-09-18 10:26 发表评论
]]>
正则表达式中的\n和\rhttp://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.htmlzhyiwwwzhyiwwwmon, 17 sep 2007 05:09:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.htmlhttp://www.blogjava.net/zhyiwww/comments/145817.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/09/17/145817.html#feedback0http://www.blogjava.net/zhyiwww/comments/commentrss/145817.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/145817.html下图是\r的匹配结果:

regex1.png 

下图是\n的匹配结果:
regex2.png 



zhyiwww 2007-09-17 13:09
]]>
我自己写的测试正则表达式http://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.htmlzhyiwwwzhyiwwwfri, 10 aug 2007 16:01:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.htmlhttp://www.blogjava.net/zhyiwww/comments/135956.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/08/11/135956.html#feedback0http://www.blogjava.net/zhyiwww/comments/commentrss/135956.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/135956.htmlrg1.jpg

网上看到的一个匹配ip的正则表达式的例子如下:
(\d )\.(\d )\.(\d )\.(\d )
匹配结果如下图:
ip.jpg
显然,上面的那个式子在严格上来说是不能匹配ip地址的。因为,无效的ip地址也能成功匹配,
所以,这个式子没有考虑到ip地址的特殊的数字限制。
网上有人给了这样一个验证ip的式子:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
我个人觉得这个还是考虑的比较全的。

分析一下下面的正则表达式的不同意义:
((de)|(ab))
可以匹配的串如下
rg2.jpg
也就是说,可以匹配
de或者ab,也只能匹配这两个独立的串,如果想匹配de和ab串的组合串,如何处理呢?比如,想匹配abde或者deab等。


((de)|(ab))*
可以匹配的串如下:
rg3.jpg

由上图我们可以知道,上面的式子可以匹配de和ab的任意顺序组合的字符串。
但是前面的那个式子就只能匹配单个的de或者ab.
这个就是他们的区别。


初学,仅做测试,欢迎交流。





zhyiwww 2007-08-11 00:01
]]>
正则表达式的匹配http://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.htmlzhyiwwwzhyiwwwfri, 10 aug 2007 05:21:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.htmlhttp://www.blogjava.net/zhyiwww/comments/135786.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/08/10/135786.html#feedback0http://www.blogjava.net/zhyiwww/comments/commentrss/135786.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/135786.html如下
[ab]*或者[a|b]*能匹配成什么字符串呢?
在此列表如下:
a
b
a……
b……

ab
(ab)……
a……b
ab……

ba
b……a
ba……
(ba)……

……表示重复。
我想大概可以表示成上面的几种情形。也就是说
[ab]*就可以描述由a和b两个字符组成的所有字符串了。
可见我们使用正则表达式,可以让我们省去多少的语言语句来描述。



zhyiwww 2007-08-10 13:21
]]>
疑惑:如何用正则表达式来验证日期http://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.htmlzhyiwwwzhyiwwwmon, 19 mar 2007 03:07:00 gmthttp://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.htmlhttp://www.blogjava.net/zhyiwww/comments/104687.htmlhttp://www.blogjava.net/zhyiwww/archive/2007/03/19/104687.html#feedback5http://www.blogjava.net/zhyiwww/comments/commentrss/104687.htmlhttp://www.blogjava.net/zhyiwww/services/trackbacks/104687.html我们要检验的日期格式:xxxx-xx-xx(x为数字)


[\d]{4}-[\d]{2}-[\d]{2}

这个是我看到的一个日期验证的正则表达式。

看起来能实现,因为

2006-6-6 肯定是不符合的,而

2006-06-06 肯定是符合的。

但是,我们来看,

2006-00-00 也肯定是符合的,但是,有意义吗?

2006-99-99 也肯定是符合的,但是,有意义吗?

答案,大家都知道,肯定没有意义。所以,我觉得这个表达式还有要改进的地方。

问题的关键是数值大小的限制,如何来限制?

我把它改进了一下:

[\d]{4}-[0-1][0-9]-[0-3][0-9]

我们乍一看,觉得可行,

2006-19-39 肯定符合,但是没有意义。

看来,还是有问题。

到现在,我也没有想清楚这个看似简单的问题如何来解决。

 

如果用这个表达式来检验日期的话,是不行的,还需要你进行数值范围的验证。

如果哪位朋友知道的话,请指点一二。谢谢。



zhyiwww 2007-03-19 11:07
]]>
网站地图