技術(shù)-java第06章字符串操作_第1頁(yè)
技術(shù)-java第06章字符串操作_第2頁(yè)
技術(shù)-java第06章字符串操作_第3頁(yè)
技術(shù)-java第06章字符串操作_第4頁(yè)
技術(shù)-java第06章字符串操作_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余20頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

6章字符串操作JavaJava中的幾個(gè)主要的跟字符相關(guān)數(shù)據(jù)結(jié)構(gòu)類型:字符、字符串(String類、字符串緩沖(StringBuffer類、字符串分解類(StringTokenizer類和正則表達(dá)式(RegularExpressionsJava中已經(jīng)提供的強(qiáng)大字符串?dāng)?shù)據(jù)結(jié)構(gòu)可以使編寫字符和字字符是一種通用數(shù)據(jù)類型,用單引號(hào)括起來(lái)的一個(gè)字符,如'a'、'A'。在本書前面已經(jīng)介紹過(guò)了字符,跟字符密切相關(guān)的通用數(shù)據(jù)類型是字符串。字符串常量是引號(hào)括起來(lái)的一串字符,比如"oordn"JavaString類(String類將在6.2節(jié)中介紹)的一個(gè)特定的對(duì)象來(lái)處理的,而不是一個(gè)數(shù)據(jù)。StringJava中,字符串變量的類型為StringString類的特殊對(duì)象String類的構(gòu)造在最通常的情況下,stringStringgreeting= Stringgreeting=newString("用"o"構(gòu)造出greeting這個(gè)String類的對(duì)象。char[]bunch={'H','e','l','l','o'};Stringgreeting=newString(bunch);bunchgreeting。String類的構(gòu)造函數(shù)還有其他的形式:字符串比較兩個(gè)字符串內(nèi)容是否一樣可以使用String類中提供的equals和equalsIgnoreCase兩個(gè)方法。而equals測(cè)試兩個(gè)字符串是否含有相同的字符,equalsIgnoreCase則是忽略字符串中的大小寫(Case)比較兩個(gè)字符串的。如果結(jié)果一致,這兩個(gè)方法返回true,內(nèi)容不同,則返回值為false。需要注意的地方是在Java早期的版本中==運(yùn)算符只能用來(lái)測(cè)試兩個(gè)字符串是否是相同的字符串實(shí)例,而在新的JDK中,==運(yùn)算符和equals的效果是一樣如果要比較兩個(gè)字符串的大小關(guān)系,即它們按字母序排列的時(shí)候誰(shuí)將排面,String類提供了一個(gè)compareTo的方法,它的函數(shù)原型是:publicintcompareTo(String它的返回值為一個(gè)整型的值,如果返回值為-1str的前面,返回值為0,該字符串與str內(nèi)容一致;返回值為1,該字符串在str后面。//~publicclass{publicpublicstaticvoidmain(String[]{StringstrA="AppleTree";StringstrB="appleTREE";StringstrC="AppleTree";if(strA==strB)System.out.println(strA+"&"+strB+"arethe}elseSystem.out.println(strA+"&"+strB+"arenotthe}if(strA==strC)System.out.println(strA+"&"+strC+"arethe}elseSystem.out.println(strA+"&"+strC+"arenotthe}if(strA.equals(strB))System.out.println(strA+"isequalsto"+}elseSystem.out.println(strA+"isnotequalsto"+}if(strA.equals(strC))System.out.println(strA+"isequalsto"+}elseSystem.out.println(strA+"isnotequalsto"+}if(strA.equalsIgnoreCase(strB))System.out.println(strA+"&"+strB+"arethe}elseSystem.out.println(strA+"&"+strB+"arenotthe}}}AppleTree&appleTREEarenotthesame.AppleTree&AppleTreearethesame.AppleTreeisnotequalstoappleTREEAppleTreeisequalstoAppleTreeAppleTree&appleTREEarethesame(nocase).hashCode()String類提供一個(gè)hashCode()的方法,返回int類型的哈希值,其計(jì)算公式如hashcode=s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-s[i]i個(gè)字符,n是字符串的長(zhǎng)度,^是冪運(yùn)算符號(hào)。空字符串的哈希值是0。publicclass{publicTestHashCode()publicstaticvoidmain(String[]{Stringstr=intcode=System.out.println("theString"+str+"hashcodeis"+}}theStringabchashcodeis要查找某個(gè)字符或者子字符串在一個(gè)字符串中的位置,Java提供的方法是indexOf,publicintindexOf(intUnicodech的字符的位置,并返回。如果查找失敗,返回-publicintindexOf(intch,intfromIndexUnicodech的字符的位置,并返回。如果publicintlastIndexOf(intUnicodech的字符的位置,并返回。如果查找失敗,返回-publicintlastIndexOf(intch,intfromIndex)fromIndexUnicodech的字符的位置,并返回。如果查找失publicintindexOf(String查找字符串中的一個(gè)子串為str的位置,并返回。如果查找失敗,返回-publicintindexOf(Stringstr,intfromIndexstr的位置,并返回,如果查找失敗,publicintlastIndexOf(String查找字符串中最后一個(gè)子串為str的位置,并返回,如果查找失敗,返回-publicintlastIndexOf(Stringstr,intfromIndexstr的位置,并返回,如果查找失敗,返回-1;publicclass{publicTestIndex()publicstaticvoidmain(String[]{Strings="ssabcdefgabcklabcstabcxyz";Stringsubs="abc";System.out.println("thefirst'a'isat"+s.indexOf('a'));System.out.println("thelast'a'isat"+s.lastIndexOf('a'));System.out.println("thefirst'a'after10isat"+s.indexOf('a',10));System.out.println("thelast'a'before10isat"+System.out.println("thefirstabcisat"+s.indexOf(subs));System.out.println("thelastabcisat"+s.lastIndexOf(subs));System.out.println("thefirstabcafter10isat"+s.indexOf(subs,10));System.out.println("thelastabcbefore10isat"+}}程序中用于查找的字符串為"ssabcdefgabckabcsabcxyz",分別按不同的條件查找‘a(chǎn)’和"abc"的位置。thefirst'a'isat2thelast'a'isatthefirst'a'after10isat14thelast'a'before10isat9thefirstabcisat2thelastabcisatthefirstabcafter10isat14thelastabcbefore10isat9抽取Stringsubstring,它有以下幾種形式:publicStringsubstring(intbeginIndex);beginIndexbeginIndex的取值范圍應(yīng)該在區(qū)間[0,publicStringsubstring(intbeginIndex,intbeginIndexendIndexbeginIndexendIndex取值范圍也應(yīng)該在區(qū)間[0,n]內(nèi),且beginIndex<=endIndex,如果不滿足,返回值為空字符串。publicclass{publicTestSubstring()publicstaticvoidmain(String[]{Stringstr="ThisisanSystem.out.println("thesubstringafter11is"+str.substring(11));System.out.println("thesubstringbetween8&10is"+}}thesubstringafter11isapplethesubstringbetween8&10isan字符串非常遺憾的是,由于String類不提供修改自身的方法,因此,String從初始化之后就不能再改變其內(nèi)容了,如果要使用String類的方法對(duì)改變一個(gè)字符串的內(nèi)容,必須另外生成一個(gè)新的字符串,或者,更方便的方法是使用StringBuffer類來(lái)保存字符串的內(nèi)容而不是String類。StringBuffer類的用法在6.3節(jié)會(huì)有詳細(xì)敘述。String類的其他publicintpubliccharcharAt(intipublicStringreplace(charoldChar,charoldCharnewCharStrngvalueOf方法,將其它類型的變量轉(zhuǎn)化為字符串并返回。可供轉(zhuǎn)化的變量的類型有:int、foat、doube、ong、char、char[]、Obect等。程序示例://~publicclass{publicTestExtraString()publicstaticvoidmain(String[]{Stringstr="Thisisanapple.";intslen=str.length();System.out.println("Thelengthof"+str+"is"+for(inti=0;i<slen;i++)System.out.println("No."+i+"charis:"+}System.out.println("Changeatob:"+str.replace('a',//將字符串中的'a'改為'b'打doubled=Stringdstr=String.valueOf(d);System.out.println("thedouble'sStringis"+dstr);}}ThelengthofThisisanapple.is17No.0charis:TNo.1charis:hNo.2charis:iNo.3charis:sNo.4charis:No.charis:icharis:scharis:No.8charis:aNo.9charis:nNo.10charis:No.11charis:aNo.12charis:pNo.13charis:pNo.14charis:lNo.15charis:eNo.16charis:Changeatob:Thisisbnbpple.thedouble'sStringis3.141529StringBuffer由于String類不能用于修改,Java中提供一種字符串內(nèi)容可變化的StringBuffer類。 類的使用跟String 類相似,但同時(shí)可以通過(guò)它的方法修改自身長(zhǎng)度和內(nèi)容。StringBuffer類的設(shè)計(jì)是滿足多線程的要求的,即StringBuffer類的對(duì)象可用于多個(gè)線 類的構(gòu)造 類有三個(gè)構(gòu)造函數(shù)publicpublicStringBuffer(intlength);publicStringBuffer(String以一個(gè)String類的對(duì)象str的內(nèi)容到StringBuffer的內(nèi)容中,StringBuffer的長(zhǎng)度str16StringBuffersbuffer1=newStringBuffer();StringBuffersbuffer2=newStringBuffer(50);Stringstr="Thisisacat.Thatisadog.Iamaboy.Whatareyou?";StringBuffersbuffer3=newStringBuffer(str);length()、capacity()、setLength() ensureCapacity()方String類相似,StringBufferlength()StringBufferStringBuffer類另外提供capacity()方法返回StringBuffer的容 minimumCapacity)用來(lái)確保 的容量不低setLength(intnewLength)StringBuffernewLength。publicintlength();publicintcapacity();publicvoidsetLength(intpublicvoidensureCapacity(intcapacity(容量)與length(長(zhǎng)度)//~StringBufferCapa.javapublicclassStringBufferCapapublicStringBufferCapa()}publicstaticvoidmain(String[]{StringBuffersBuffernewStringBuffer("abcdefghijklmnopqrstuvwxyz");System.out.println("Thelengthis:"+sBuffer.length());System.out.println("Thecapacityis:"+sBuffer.capacity());System.out.println("Setthelengthis40");System.out.println("Thelengthis:"+sBuffer.length());System.out.println("Thecapacityis:"+sBuffer.capacity());System.out.println("Setthelengthis60");System.out.println("Thelengthis:"+sBuffer.length());System.out.println("Thecapacityis:"+sBuffer.capacity());}}Thelengthis:26Thecapacityis:42Setthelengthis40Thelengthis:40Thecapacityis:42Setthelengthis60Thelengthis:60Thecapacityis:86lengthcapacitylength26>16,于capacity26+16=42;設(shè)length40后,因40<42,capacity不變;當(dāng)設(shè)置的length為60,60>42,于是新的capacity就是60+16=86了。charAt()、setCharAt()、getChars() reverse()方charAt(inti)iStringsetCharAt(inti,charnewChar)inewChargetChars(intsrcBegin,intsrcEnd,char[]dst,int將StringBuffer中的字符串從srcBegin到srcEnd之間的內(nèi)容到目的字符數(shù)組dstBeginreverse()StringBuffer中的字符串翻轉(zhuǎn)。對(duì)setCharAt()和reverse()方法的程序示例:publicclassStringBufferChar{publicStringBufferChar(){}publicstaticvoidmain(String[]{StringBuffersBuffernewStringBuffer("abcdefghijklmnopqrstuvwxyz");for(inti=5;i<10;i++){sBuffer.setCharAt(i//59的位置設(shè)為} //打印sBuffer的內(nèi) //打印sBuffer的內(nèi)容}} Append()在String類中,要連接兩個(gè)字符串需要?jiǎng)?chuàng)建一個(gè)新的String來(lái)保存,而在類中提供了append方法,直接在字符串后添加的內(nèi)容appendappend(booleanb):在字符串后附加一個(gè)布爾型參數(shù)的字符串形式。append(charc):在字符串后附加一個(gè)字符型參數(shù)的字符串形式。append(inti):在字符串后附加一個(gè)整型參數(shù)的字符串形式。append(longl):在字符串后附加一個(gè)長(zhǎng)整型參數(shù)的字符串形式。append(floatf):在字符串后附加一個(gè)浮點(diǎn)數(shù)型參數(shù)的字符串形式。append(doubled):在字符串后附加一個(gè)雙精度參數(shù)的字符串形式。append(charstr):在字符串后附加一個(gè)字符數(shù)組參數(shù)組成的字符串。,append(Objecto)Objectappend(Stringstr)String類的字符串。publicclassStringBufferAppend{publicStringBufferAppend(){}publicstaticvoidmain(String[]{StringBuffersBuffer=newStringBuffer("abcd"); sBuffer.append("boolean:");sBuffer.append("int:");sBuffer.append("double:"); }}abcd----boolean:trueint:1插入和StringBufferinsertappend相似,根據(jù)插入的參數(shù)的不同,insert也有十種形式:StringBufferinsert(intoffset,booleanb)StringBufferinsert(intoffset,charc)StringBufferinsert(intoffset,char[]str)StringBufferinsert(intindex,char[]str,intoffset,intlen)StringBufferinsert(intoffset,doubled)StringBufferinsert(intoffset,floatf)StringBufferinsert(intoffset,inti)StringBufferinsert(intoffset,longl)StringBufferinsert(intoffset,Objectobj)StringBufferinsert(intoffset,Stringstr)offset的參數(shù)指示插入字符串的位置,其他參數(shù)的含義和append方法一樣。StringBufferdeletedeleteCharAt方法。StringBufferdelete(intstart,intend);StringBufferstartendStringBufferdeleteCharAt(intindex指定的位置上刪除一個(gè)字符。StringBuffer的長(zhǎng)度縮短一個(gè)字符。publicclass{publicStringBufferInsDel()publicstaticvoidmain(String[]{StringBuffersBuffer=newStringBuffer();sBuffer.insert(0,true);sBuffer.insert(2,3. sBuffer.insert(4,"boolean");System.out.println("Thelengthis:"+sBuffer.length());sBuffer.delete(4,11);System.out.println("Thelengthis:"+sBuffer.length());}} Thelengthis:20 Thelengthis: 類的其他String提供了toString()方法,返回與StringBuffer字符串內(nèi)容一樣的一個(gè)StringString由上節(jié)字符串String類的介紹可知,這個(gè)方法其實(shí)跟String類的靜態(tài)方法 sb)的效果是與 類一樣,也提供定位字符、字符串的方法intindexOf(StringintindexOf(Stringstr,intfromIndex);intlastIndexOf(Stringstr);intlastIndexOf(Stringstr,int由于例子與String的相似,這里不一一枚StringTokenizerStringTokenizer,是Java里面提供的便字符串分解器,它的原理是根據(jù)分隔符把字符串分解為一個(gè)個(gè)的標(biāo)記(Token),然后按照請(qǐng)求返回各個(gè)標(biāo)記。這個(gè)過(guò)程稱為 類的構(gòu)造函數(shù)StringTokenizerStringTokenizer(StringStringTokenizer;StringTokenizer(Stringstr,Stringdelim);StringTokenizer,并指定分隔符;StringTokenizer(Stringstr,Stringdelim,booleanreturnDelims);用一個(gè)指定的字符串構(gòu)造一個(gè)StringTokenizer,并指定分隔符,并指定是否將分隔符 類的常用方法StringnextToken(Stringdelim,返回下一個(gè)標(biāo)記(Token);StringnextToken();StringTokenizer中的下一個(gè)標(biāo)記ObjectnexnextTokenObject;intcountTokens(); 行,另一個(gè)addBr()方法將回車符'\n'用HTML里面的換行標(biāo)記"<br>"替換:importjava.util.*;importpublicclass{publicTestStringTokenizer(){}publicstaticvoidmain(String[]args){TestStringTokenizertst=newStringstr="begin\n:startup\naddab\n:calculation\nendStringstrnew1 //去掉:開(kāi)頭的Stringstrnew2=System.out.println("Theoriginalstringis:\n"+System.out.println("Thestring mentis:\n"System.out.println("ThestringafterContentis:\n"+}public Content){StringmakeContent=newStringTokenizerstrToken=newStringtempToken=null;//如果首字符不是’:’,加入makeContent內(nèi)容}return}publicStringaddBr(StringContent){StringmakeContent=newStringTokenizerstrToken=newStringTokenizer(Content,"\n");makeContent=makeContent+strToken.nextToken()+//在各個(gè)token之后加入}return}}TheoriginalstringaddaThestringafter mentis:addabThestringafterContentis:begin<br>addab<br>end<br>改進(jìn)的StringTokenizer類:BreakIteratorSringokenzer用起來(lái)很方便,但它的功能卻很有限。這個(gè)類只是簡(jiǎn)單地在輸入字符串中查找分隔符,一旦找到了分隔符就分割字符串。它不會(huì)檢查分隔符是否在子串之中這類條件,當(dāng)輸入字符串中出現(xiàn)兩個(gè)連續(xù)的分隔符時(shí),它也不會(huì)返回""(字符串長(zhǎng)度為0)形式的標(biāo)記。我們?cè)倩仡^分析一下StringTokenizer類的三個(gè)構(gòu)造方法和它s們的局限:StringTokenizer(StringsInput):以空白字符("","\t","\n")為分隔符分割字符串。StringTokenizer(StringsInput,StringsDelimiter):以sDelimiter為分隔符分割字符串。StringTokenizer(StringsInput,StringsDelimiter,booleanbReturnTokens)sDelimiterbReturnTokens為true第一個(gè)構(gòu)造函數(shù)查輸入字符串是否包含子串。例如,如果以空白字符為分隔符分割"o.oday\"Iam\"gongoyhoeown",則字符分結(jié)是o.、oday、"、a、"、goingo.、oday、"Iam"、going等。第二個(gè)構(gòu)造函數(shù)查兩個(gè)分隔符連續(xù)出現(xiàn)的情況。例如,如果以","為分隔符分割publication和datepublished這四個(gè)標(biāo)記,而不是book、author、publication、""、""datepublished這6個(gè)標(biāo)記(其中""表示0長(zhǎng)度字符串。要得到6個(gè)標(biāo)記的答案,你必須把StringTokenizer的bReturnTokens參數(shù)設(shè)置為true。為了突破這些局限,Java2BreakIteratorStringTokenizer之上BreakIterator位于java.text.*包中,適合于文本分析的操作,獲得文本中的信息, 的主要方voidsetText(StringnewText) 設(shè)置BreakIterator類中的文本為newText;currentfirstnextlastprevious()這些方法分別返回文本中當(dāng)前邊界(boundary,isBoundary(int 判斷offset是否處在一個(gè)邊界上importjava.text.*;importjava.util.Locale;publicclass{publicTestBreakIterator()publicstaticvoidmain(String[]{if(args.length==1)StringstringToExamine=//printeachwordinBreakIteratorboundary=BreakIterator.getWordInstance();printEachForward(boundary,stringToExamine);//printeachsentenceinreverseboundary=BreakIterator.ge printEachBackward(boundary,stringToExamine);printFirst(boundary,stringToExamine);printLast(boundary,stringToExamine);}}publicstaticvoidprintEachForward(BreakIteratorboundary,Stringsource){intstart=boundary.first();for(intend=boundary.next();end!=start=end,end={}}publicstaticvoidprintEachBackward(BreakIteratorboundary,Stringsource){intend=for(intstart=boundary.previous();start!=BreakIterator.DONE;end=start,start={}}publicstaticvoidprintFirst(BreakIteratorboundary,String{intstart=boundary.first();intend=boundary.next();}publicstaticvoidprintLast(BreakIteratorboundary,String{intend=boundary.last();intstart=boundary.previous();}publicstaticvoidprintAt(BreakIteratorboundary,intpos,String{intend=boundary.following(pos);intstart=boundary.previous();}}javajavaTestBreakIterator"Thisisanapple,Thatisa,a.Thisisanapple,Thatisaboy.Thisisanapple,Thatisaboy.Thisisanapple,Thatisaboy.使用正則表正則表J2SDK1.4中加入的java.util.regex包提供了對(duì)正則表達(dá)式(Regularexpressions)的支Java.lang.StringreplaceAllsplit函數(shù)也是間接地調(diào)用正則表達(dá)式來(lái)實(shí)現(xiàn)正則表達(dá)式是根據(jù)文本匹配模式的方法,類似于編譯器生成類文件的工作原理。編譯器譯器能夠只將有效的源代碼表示轉(zhuǎn)換為已編譯的類文件。在正則表達(dá)式的上下文中,模式是字符序列的文本表示法。例如,如果想知道一個(gè)字符序列中是否存在carar于更復(fù)雜的模式則可以使用特殊字符作為占位符。如果不是要搜索car,而是想搜索以字母c開(kāi)頭并以字母r結(jié)尾的任何文本字符串,你會(huì)使用c*r模式,其中*代表第一個(gè)rc*r模式將匹配任何以c開(kāi)頭并以rcougar、cavaier或chryser。模式匹配的主要部分是關(guān)于要使用什么樣的表達(dá)式。Pattern先保存要使用的表達(dá)式,然后將其傳遞給Matcher類以便在字符序列的上下文中檢查其匹配情況。例如,如果您想驗(yàn)證一個(gè)電子郵件地址,您可能要檢查用戶輸入是否與這樣一個(gè)模式匹配—它包含一個(gè)字母數(shù)字序列,后跟一個(gè)@符號(hào),@后又跟兩組用句點(diǎn)隔開(kāi)的字符。這可以用表達(dá)式\p{Alnum}+@\w+\.\p{Alpha}{2,3}(是的,這過(guò)于簡(jiǎn)化了電子郵件地址的結(jié)構(gòu),可\p{Alnum}+@\w+\.\p{Alpha}{2,3}。\p{Alnum}序列表示單個(gè)字母數(shù)字字符(A到Z、a到z或0到9。\p{Alnum}后面的加號(hào)(+)被稱為量詞(fier。它被應(yīng)用在表達(dá)式的前面部分,表示\p{Alnum}必須出現(xiàn)一次或次。使用星號(hào)(*)表示要出現(xiàn)零次或一次以上(含一次。@就是意味著它必須出現(xiàn)在至少一個(gè)字母數(shù)字字符之后,這樣整個(gè)模式匹配才能成功。\w+與\p{Alnum}+類似,但添加了下劃線(_。某些序列有多個(gè)表達(dá)式。反斜杠(\.)代表句點(diǎn)。如果前面沒(méi)有反斜杠,單獨(dú)一個(gè)句點(diǎn)代表任意字符。最后的\p{Alpha}{2,3}表示兩個(gè)或三個(gè)字母字符。只要學(xué)會(huì)了規(guī)范語(yǔ)言,您就能掌握模式的所有。我們來(lái)看一些更常用的表達(dá)式的種類:(Literal量詞(fier:某些字符或表達(dá)式,它們被用來(lái)計(jì)算一個(gè)文字或分組可以在字符? +字符類(Characterclass:一個(gè)字符類就是方括號(hào)內(nèi)的一個(gè)字符集,其中,匹配可以是\d數(shù)字(0到\D\s\S\w單字字符(a到z、A到Z、0到9以及下劃線\W非單字字符(其它任意字符Posix字符類(Posixcharacterclass)US-ASCII比較時(shí)才有效。\p{Lower}\p{Upper}\p{ASCII}所有ASCII\p{Alpha}字母字符(\p{Lower}與\p{Upper}相結(jié)合\p{Digit}從0到9\p{Alnum}范圍(Range:使用短線(dash)來(lái)指定包括一定范圍字符的字符類。例如,[A-J]表示從A到J的大寫字母。否定(Negation:脫字符(^)否定字符類的內(nèi)容。例如,[^A-J]表示除A到J之Java(aterSyaEcetionPatternJava提供了兩個(gè)用于正則表達(dá)式的類,PatternMatcher 類的主要 split()方 類用于構(gòu)建一個(gè)模式對(duì)象來(lái)代表一個(gè)正則表達(dá)式,如StringregularExpression=Patternpattern 有了一個(gè)編譯好的模式后,可以使用Pattern類根據(jù)模式把一個(gè)輸入行分割為一系列單字,或者使用Matcher類執(zhí)行一些更復(fù)雜的任務(wù)。Stringwords[] split方法是便的方法,它在與此模式匹配的位置將給定輸入序列切分開(kāi)。下面importjava.util.regex.*;publicclassSplitter{publicstaticvoidmain(String[]args)throws{Patternp= String[]result=p.split("one,two, four,for(inti=0;i<result.length;i++)}}Matcher如果想獲取特定的輸入,就需要Pattern的matcher()方法。在給定某個(gè)輸入時(shí),這個(gè)方法將返回適當(dāng)?shù)腗atcher類。接著,使用Matcher實(shí)例遍歷整個(gè)結(jié)果在輸入序列中查找不同的模式匹配,或者使用Matcher實(shí)例作為查找-替換工具(后法更好:Matchermatcher=要根據(jù)整個(gè)序列匹配模式,請(qǐng)使用matches()。要確定是否只有序列的一部分匹配,請(qǐng)使用find():if(matcher.find())Stringmatch=}下面這個(gè)例子從由參數(shù)指定的文件中找出最長(zhǎng)的單詞,從下面這個(gè)例子中我們可以看到Macher的用法。importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjava.nio.charset.*;importjava.util.*;importpublicclassLongestpublicstaticvoidmain(String{if(args.length!=1){System.err.println("Provideafilename");}tryFileInputStreaminputnewFileChannelchannel=input.getChannel();intfileLength=(int)channel.size();MappedByteBufferbuffer=channel.map(FileChannel.MapMode.READ_ONLY,0,Charsetcharset=Charset.forName("ISO-8859-1");CharsetDecoderdecoder=charset.newDecoder();CharBuffercharBuffer=decoder.decode(buffer);PatternlinePatternpile(".*$",PatternwordBreakPatternMatcherlineMatcher=Stringlongest=while(lineMatcher.find())Stringline=Stringwords[]=for(inti=0,n=words.length;i<n;i++)if(words[i].length()>{longest=}}}System.out.println("Longestword:"+}catch(IOException{System.err.println("Error}}}操作符優(yōu)轉(zhuǎn)義符限定符*,+,?,{n},{n,},位置和順序^,$,\或操作正則式\將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)向后、或一個(gè)八進(jìn)制轉(zhuǎn)義符。例如,'n'"n"'\n''\\'匹配"\"而"\("則匹配"("。^匹配輸入字符串的開(kāi)始位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配'\n'或'\r'之后的位置。$匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配'\n'或'\r'之前的位置。*匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配"z"以及"zoo"。*+匹配前面的子表達(dá)式一次或多次。例如,'zo+'能匹配"zo"以及"zoo"匹配"z"。+等價(jià)于{1,}?匹配前面的子表達(dá)式零次或一次。例如,"do(es)?"可以匹配"do"或"does""do"。?等價(jià)于{0,1}{n}n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food"中的兩個(gè)o。{n,}nn次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood"中的所有o。'o{1,}'等價(jià)于'o+'。'o{0,}'則等價(jià)于'o*'。{n,m}m和nn<=m。最少匹配n次且最多匹配m次。例如,"o{1,3}"將匹配"fooooood"中的前三個(gè)o。'o{0,1}'等價(jià)于'o?'。請(qǐng)注意在逗號(hào)和兩?當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},n,})后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對(duì)于字符串"oooo",'o+?'將匹配單個(gè)"o",而'o+'將匹配所有'o'。.匹配除"\n"之外的任何單個(gè)字符。要匹配包括'\n''[.\n]'(pattern)匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的Matches集合VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號(hào)字符,請(qǐng)使用'\('或'\)'。(?:pattern)匹配pattern但不獲取匹配結(jié)果,也就是說(shuō)這是一個(gè)非獲取匹配,不進(jìn)行供以后使用。這在使用"或"字符(|)來(lái)組合一個(gè)模式的各個(gè)部分是很有用。例如,'industr(?:y|ies)就是一個(gè)比'industry|industries'更簡(jiǎn)略的表達(dá)式。(?=pattern)正向預(yù)查,在任何匹配pattern的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是供以用。例如,'Windows(?=95|98|NT|2000)'能匹配"Windows2000"中的"Windows""Windows3.1"中的"Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后(?!pattern)負(fù)向預(yù)查,在任何不匹配pattern的字符串開(kāi)始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說(shuō),該匹配不需要獲取供以后使用。例如'Windows(?!95|98|NT|2000)'能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。預(yù)查不消耗字符,也就是說(shuō),在一個(gè)匹配發(fā)生后,在最后一次匹配之后 x或y。例如,'z|food'"z"或"food"。'(z|f)ood'"zood""food" 字符集合。匹配所包含的任意一個(gè)字符。例如,'[abc]'可以匹配"plain"中的'a'。 '[^abc]'"plain"中[a- 字符范圍。匹配指定范圍內(nèi)的任意字符。例如,'[a-z]'

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論