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相关的乱七八糟的东西