随笔-5  评论-41  文章-13  trackbacks-0

1 <script language="javascript">
2 function format(){
3     var r = /\S[^\r\n]*\S/;
4     var name="\r\n              username__  nn \r\n               ";
5     var rName=name.match(r);
6     return rName;
7 }
8 </script>

    这两天被正则表达式搞得云里雾里的。很快就得出了自己想要的结果,但是却连自己都不知道自己的正则表达式应该怎么解释。以前虽然也用过正则表达式写一些东 西,但是却没仔细理解过它的执行步骤。借此机会对正则表达式进行了一下学习,才发现原来知道了正则表达式的执行步骤之后,要对它进行解释也是很容易的。
    以上面的代码为例,目标是要取出“username__  nn”这个字符串。
    我原来的错误理解是这样的:一开始就拿整个正则表达式“\S[^\r\n]*\S”去对name字符串从左到右进行匹配,那么以“非空字符(\S)”开头,以“非空字符(\S)”结尾,中间是非"\r\n"的字符串,第一个匹配的结果应该是“username__”啊,怎么会是“username__  nn”呢?后来google了一些资料看了之后才明白,是我把执行的步骤搞错的。
    正确的解释应该是这样的:首先用正则表达式的第一个匹配符“\S”去对name进行匹配,得到结果"username__  nn \r\n               ",然后用"[^\r\n]*"从"s"开始进行匹配,得到结果"username__  nn空格",由于最后用"\S"对前面得出的结果"username__  nn空格"进行匹配(由于[^\r\n]*中的*的存在,所以匹配"\S[^\r\n]*"的其实是一组结果--从"us"一直到"username__  nn空格",而最后那个"\S"则是对一组结果都进行匹配,匹配后也会得到一组结果--从"us"一直到"username__",再加上"username__  n"和"username__  nn"),返回最大匹配结果,得到正确的结果"username__  nn"。
    写得好像有点乱,要是看完理解不了的话,按照上面说的可能结果对原始字符串name进行一下修改,做一下测试就会明白了。
posted on 2006-02-08 12:04 OO 阅读(543) 评论(0)  编辑  收藏 所属分类: java相关的乱七八糟的东西

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


网站导航: