String.replaceAll

          下面的程序被設(shè)計(jì)用來打印它的類文件的名稱。如果你不熟悉類字面常量,那么我告訴你Me.class.getName()將返回Me類完整的名稱,即“com.javapuzzlers.Me”。那么,這個(gè)程序會(huì)打印出什么呢?

          package com.javapuzzlers;

          public class Me {

              public static void main(String[] args){

                  System.out.println(

                       Me.class.getName().

                          replaceAll(".","/") + ".class");

              }

          }

          該程序看起來會(huì)獲得它的類名(“com.javapuzzlers.Me”),然后用“/”替換掉所有出現(xiàn)的字符串“.”,并在末尾追加字符串“.class”。你可能會(huì)認(rèn)為該程序?qū)⒋蛴?span xml:lang="EN-US">com/javapuzzlers/Me.class,該程序正式從這個(gè)類文件中被加載的。如果你運(yùn)行這個(gè)程序,就會(huì)發(fā)現(xiàn)它實(shí)際上打印的是///////////////////.class。到底怎么回事?難道我們是斜杠的受害者嗎?

          問題在于String.replaceAll接受了一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù),而并非接受了一個(gè)字符序列字面常量。(正則表達(dá)式已經(jīng)被添加到了Java平臺(tái)的1.4版本中。)正則表達(dá)式“.”可以匹配任何單個(gè)的字符,因此,類名中的每一個(gè)字符都被替換成了一個(gè)斜杠,進(jìn)而產(chǎn)生了我們看到的輸出。

          要想只匹配句點(diǎn)符號(hào),在正則表達(dá)式中的句點(diǎn)必須在其前面添加一個(gè)反斜杠(")進(jìn)行轉(zhuǎn)義。因?yàn)榉葱备茏址谧置婧x的字符串中具有特殊的含義——它標(biāo)識(shí)轉(zhuǎn)義字符序列的開始——因此反斜杠自身必須用另一個(gè)反斜杠來轉(zhuǎn)義,這樣就可以產(chǎn)生一個(gè)轉(zhuǎn)義字符序列,它可以在字面含義的字符串中生成一個(gè)反斜杠。把這些合在一起,就可以使下面的程序打印出我們所期望的com/javapuzzlers/Me.class

          package com.javapuzzlers;

          public class Me {

              public static void main(String[] args){

                  System.out.println(

                      Me.class.getName().replaceAll(""".","/") + ".class");

              }

          }

          為了解決這類問題,5.0版本提供了新的靜態(tài)方法java.util.regex.Pattern.quote。它接受一個(gè)字符串作為參數(shù),并可以添加必需的轉(zhuǎn)義字符,它將返回一個(gè)正則表達(dá)式字符串,該字符串將精確匹配輸入的字符串。下面是使用該方法之后的程序:

          package com.javapuzzlers;

          import java.util.regex.Pattern;

          public class Me {

              public static void main(String[] args){

                  System.out.println(Me.class.getName().

                                 replaceAll(Pattern.quote("."),"/") + ".class");

              }

          }

          該程序的另一個(gè)問題是:其正確的行為是與平臺(tái)相關(guān)的。并不是所有的文件系統(tǒng)都使用斜杠符號(hào)來分隔層次結(jié)構(gòu)的文件名組成部分的。要想獲取一個(gè)你正在運(yùn)行的平臺(tái)上的有效文件名,你應(yīng)該使用正確的平臺(tái)相關(guān)的分隔符號(hào)來代替斜杠符號(hào)。這正是下一個(gè)謎題所要做的。

          posted on 2009-04-06 13:26 胡鵬 閱讀(658) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)java基礎(chǔ)

          導(dǎo)航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 清徐县| 保定市| 河南省| 岑巩县| 关岭| 天气| 吉安市| 普宁市| 阿合奇县| 惠安县| 资溪县| 中宁县| 馆陶县| 抚州市| 龙岩市| 田林县| 金平| 呼图壁县| 西贡区| 临泽县| 邛崃市| 白银市| 双柏县| 廉江市| 绥中县| 邢台县| 邻水| 舟山市| 宜川县| 日照市| 蒲城县| 建瓯市| 攀枝花市| 金坛市| 九寨沟县| 外汇| 铁岭市| 武夷山市| 揭阳市| 白朗县| 靖州|