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>
這兩天被正則表達(dá)式搞得云里霧里的。很快就得出了自己想要的結(jié)果,但是卻連自己都不知道自己的正則表達(dá)式應(yīng)該怎么解釋。以前雖然也用過正則表達(dá)式寫一些東
西,但是卻沒仔細(xì)理解過它的執(zhí)行步驟。借此機(jī)會對正則表達(dá)式進(jìn)行了一下學(xué)習(xí),才發(fā)現(xiàn)原來知道了正則表達(dá)式的執(zhí)行步驟之后,要對它進(jìn)行解釋也是很容易的。
以上面的代碼為例,目標(biāo)是要取出“
username__ nn”這個字符串。
我原來的錯誤理解是這樣的:一開始就拿整個正則表達(dá)式“
\S[^\r\n]*\S”去對name字符串從左到右進(jìn)行匹配,那么以“非空字符(\S)”開頭,以“非空字符(\S)”結(jié)尾,中間是非"\r\n"的字符串,第一個匹配的結(jié)果應(yīng)該是“
username__”啊,怎么會是“
username__ nn”呢?后來google了一些資料看了之后才明白,是我把執(zhí)行的步驟搞錯的。
正確的解釋應(yīng)該是這樣的:首先用正則表達(dá)式的第一個匹配符“\S”去對name進(jìn)行匹配,得到結(jié)果"
username__ nn \r\n ",然后用"[^\r\n]*"從"
s"開始進(jìn)行匹配,得到結(jié)果"
username__ nn空格",由于最后用"\S"對前面得出的結(jié)果"
username__ nn空格"進(jìn)行匹配(由于[^\r\n]
*中的
*的存在,所以匹配"\S[^\r\n]*"的其實(shí)是一組結(jié)果--從"
us"一直到"
username__ nn空格",而最后那個"\S"則是對一組結(jié)果都進(jìn)行匹配,匹配后也會得到一組結(jié)果--從"
us"一直到"
username__",再加上"
username__ n"和"
username__ nn"),返回最大匹配結(jié)果,得到正確的結(jié)果"
username__ nn"。
寫得好像有點(diǎn)亂,要是看完理解不了的話,按照上面說的可能結(jié)果對原始字符串name進(jìn)行一下修改,做一下測試就會明白了。
posted on 2006-02-08 12:04
OO 閱讀(572)
評論(0) 編輯 收藏 所屬分類:
java相關(guān)的亂七八糟的東西