<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評(píng)論 :: 0 Trackbacks

    #

    用Java解決國際化問題


    首都經(jīng)貿(mào)大學(xué)信息學(xué)院 尹海琴
    01-7-18 上午 09:11:22


    如果應(yīng)用系統(tǒng)是面向多種語言的,編程時(shí)就不得不設(shè)法解決國際化問題,包括操作界面的風(fēng)格問題、提示和幫助語言的版本問題、界面定制個(gè)性化問題等。
    由于Java語言具有平臺(tái)無關(guān)、可移植性好等優(yōu)點(diǎn),并且提供了強(qiáng)大的類庫,所以Java語言可以輔助我們解決上述問題。Java語言本身采用雙字節(jié)字符編 碼,采用大漢字字符集,這就為解決國際化問題提供了很多方便。從設(shè)計(jì)角度來說,只要把程序中與語言和文化有關(guān)的部分分離出來,加上特殊處理,就可以部分解 決國際化問題。在界面風(fēng)格的定制方面,我們把可以參數(shù)化的元素,如字體、顏色等,存儲(chǔ)在數(shù)據(jù)庫里,以便為用戶提供友好的界面;如果某些部分包含無法參數(shù)化 的元素,那么我們可能不得不分別設(shè)計(jì),通過有針對(duì)性的編碼來解決具體問題。
    Java類包
    在用Java解決國際化問題的過程中,可能利用到的主要的類都是由java.util包提供的。該類包中相關(guān)的類有Locale、 ResourceBundle、ListResourceBundle、PropertyResourceBundle等,其繼承關(guān)系如下圖所示。
    其中各類提供的主要功能如下:
    Locale:該類包含對(duì)主要地理區(qū)域的地域化特征的封裝。其特定對(duì)象表示某一特定的地理、政治或文化區(qū)域。通過設(shè)定Locale,我們可以為特定的國家 或地區(qū)提供符合當(dāng)?shù)匚幕?xí)慣的字體、符號(hào)、圖標(biāo)和表達(dá)格式。例如,我們可以通過獲得特定Locale下的Calendar類的實(shí)例,顯示符合特定表達(dá)格式 的日期。
    ResourceBundle:該類是一個(gè)抽象類,需要通過靜態(tài)方法ResourceBundle.getBundle()指定具體實(shí)現(xiàn)類或?qū)傩晕募幕? 本名稱。基本名稱會(huì)協(xié)同指定的或默認(rèn)的Locale類,決定具體調(diào)用的類或?qū)傩晕募奈ㄒ幻Q。例如:指定基本類或?qū)傩晕募Q為TestBundle, 而指定的Locale是CHINESE,那么最適合匹配的類名稱為TestBundle_zh_CN.class,而最佳匹配屬性文件名稱為 TestBundle_zh_CN.properties。按照J(rèn)ava Doc和相關(guān)文檔的要求,如果該類或?qū)傩晕募]有找到,系統(tǒng)會(huì)查找近似匹配(主文件名依次為TestBundle_zh和TestBundle的類或?qū)傩? 文件)。該類提供的getKeys()方法用于獲得所有成員的鍵名,并提供handleGetObject方法獲得指定鍵的對(duì)應(yīng)元素。
    ListResourceBundle:該類繼承ResourceBundle類,主要是增加了一些便于操作的成分,但還是抽象類。如果希望使用類的方式實(shí)現(xiàn)具體的ResourceBundle,一般情況下最好繼承這個(gè)類。
    PropertyResourceBundle:該類也繼承ResourceBundle類,可以實(shí)例化。該類的行為特征如同java.util.properties類,可以從輸入流中獲得具體屬性對(duì)。
    如果涉及日期和時(shí)間顯示等問題時(shí),可以利用java.text包以及java.util包中的TimeZone、SimpleTimeZone和Calendar等類進(jìn)行輔助處理。
    參數(shù)化解決方法
    在具體應(yīng)用時(shí),可以把具體國家或地區(qū)特征中可以參數(shù)化的部分放在經(jīng)過特殊命名的屬性文件中,在確定具體的Locale后,通過PropertyResourceBundle類讀取相應(yīng)的屬性文件,實(shí)現(xiàn)國際化特征。
    使用PropertyResourceBundle類獲得當(dāng)?shù)匕姹镜膰H化信息,部分代碼如下:
      ……
      public static final String BASE_PROP_FILE =
    “DISP”;
      public static final String SUFFIX =
    “.properties”;
      locale = Locale.getDefault();
      String propFile = BASE_PROP_FILE + “_” + locale.toString()+ SUFFIX;
      ResourceBundle rb;
      try {
       File file = new File(propFile);
       if (file.exists()) {
       is = new FileInputStream(file);
       rb = new PropertyResourceBundle(is);
       if (rb == null) System.out.println(“No Resource”);
       }
      } catch (IOException ioe) {
       System.out.println(“Error open file named ” + propFile);
      }
      Enumeration e = rb.getKeys();
      while (e.hasMoreElements()){
       key = (String)e.nextElement();
       value = (String)rb.handleGetObject(key);
       System.out.println(“KEY: ” + key +
    “\t\t Value: ” + value);
      }
      ……
      DISP_zh_TW.properties文件的具體內(nèi)容如下:
      Key1=\u53ef\u4ee5
      Key2=\u64a4\u9500
    等號(hào)后面是利用native2ascii程序轉(zhuǎn)化后的繁體漢字,如果不進(jìn)行轉(zhuǎn)化,系統(tǒng)可能顯示亂碼。
    處理提示和幫助
    對(duì)于提示語言和幫助文件部分,可以把語言映射放在屬性文件或者ListResourceBundle類的子類中。下面程序是一個(gè)Servlet,它通過接受客戶端的選擇,把特定語言和字符版本的信息返回到客戶端。
      ……
      public class ProcessServlet extends HttpServlet
      { //默認(rèn)語言為中文
       public static final String DEFAULT_LANGUAGE = “zh”;
       //默認(rèn)字符集為簡(jiǎn)體中文
       public static final String DEFAULT_COUNTRY = “CN”;
       public void service(HttpServletRequest req,
    HttpServletResponse res) throws IOException, ServletException {
       HttpSession session = req.getSession(true);
       // 從客戶端收到的指定語言和字符的參數(shù)應(yīng)當(dāng)與Sun公司相關(guān)規(guī)定一致
       String lang = req.getParameter
    (“l(fā)anguage”);
       String country = req.getParameter
    (“country”);
       if (lang == null)
        {
    //如果沒有收到參數(shù),就試圖從Session里獲得
       lang = (String) session.getAttribute
    (“l(fā)anguage”);
       country = (String) session.getAttribute
    (“country”)
       } else {
       session.setAttribute(“l(fā)anguage”, lang);
       session.setAttribute(“country”, country);
       }
       if (lang == null)
        {
    //如果無法從上述手段得到語言和字符信息,就使用默認(rèn)值
       lang = DEFAULT_LANGUAGE;
       country = DEFAULT_COUNTRY
       session.setAttribute(“l(fā)anguage”, lang);
        session.setAttribute(“country”, country);
       }
       Locale locale = null;
       ResourceBundle bundle = null;
       try {
       locale = new Locale(lang, country);
       } catch (Exception e) {
       System.out.println(“No locale with” +
    country + “_” + lang);
       locale = Locale.getDefault();
       }
       try {
       bundle = ResourceBundle.getBundle(
    “DisplayList”, locale);
       } catch( MissingResourceException e) {
       System.out.println( “No resources available for locale ” + locale);
       bundle = ResourceBundle.getBundle
    (“DisplayList”, Locale.US);
       }
       res.setContentType(“text/html”);
       PrintWriter out = res.getWriter();
       out.println(“<html>”);
       out.println(“<head>”);
       String title = bundle.getString(“title”);
      String welcome =bundle.getString
    (“welcome”);
       String notice = bundle.getString(“notice”);
       out.println(“<title>”+ title +
    “</title>”);
       out.println(“</head>”);
       out.println(“<body bgcolor=\”
    white\“>”);
       out.println(“<h3>” + welcome +
    “</h3>”);
       out.println(“<br>”);
       out.println(“<b>” + notice +
    “</b>”);
       out.println(“</body>”);
       out.println(“</html>”);
       }
      }
    上述Servlet使用的屬性文件(DisplayList_zh_CN.
    properties)內(nèi)容如下:
    title=中文版
    welcome=這是簡(jiǎn)體中文版面
    notice=簡(jiǎn)體中文測(cè)試成功
    注意:該文件直接采用了中文,而不是經(jīng)過轉(zhuǎn)化的Unicode編碼,這是由于大多數(shù)Web服務(wù)器不需要上述轉(zhuǎn)化。
    在實(shí)際使用中,如果Web服務(wù)器支持Servlet 2.3規(guī)范(如jakarta-tomcate 4.0),那么上面提到的Servlet應(yīng)當(dāng)稍加改變,以作為其他Servlet的處理器使用。另外,如果把ResourceBundle的特定版本存放 在無狀態(tài)會(huì)話Bean中,就可以在一定程度上提高程序效率。
    小 結(jié)
    筆者在實(shí)際測(cè)試中發(fā)現(xiàn)了如下問題,其中部分問題得到了解決:
    1. 對(duì)于顯示字符出現(xiàn)亂碼的問題,如果是通過屬性文件實(shí)現(xiàn)國際化解決方案,那么可能是直接在屬性文件中寫入了非標(biāo)準(zhǔn)ASCII文字。解決方法是利用JDK提供 的工具native2ascii.exe掃描所有屬性文件,用掃描結(jié)果覆蓋原有文件內(nèi)容。如果我們是利用類文件實(shí)現(xiàn)轉(zhuǎn)換方案,那么需要重新編譯相關(guān)類文 件,并在編譯時(shí)指定編碼集。例如,編譯使用國標(biāo)碼的類文件,采用的編譯命令如下:
    javac -encoding GB2312 your_java_file
    2. 雖然Sun宣稱,在ResourceBundle類的實(shí)例化過程中,該類會(huì)查找與指定的基礎(chǔ)類絕對(duì)匹配和盡量與指定的Locale屬性相匹配的類。例如: 如果我們指定ResourceBundle基礎(chǔ)類為TestBundle,而Locale中指定使用zh_CN(中國大陸地區(qū)簡(jiǎn)體中文),那么如果系統(tǒng)找 不到TestBundle_zh_CN,系統(tǒng)應(yīng)當(dāng)順次查找TestBundle_zh、TestBundle。但是筆者在系統(tǒng)開發(fā)過程中發(fā)現(xiàn),該匹配沒有 產(chǎn)生任何實(shí)際效果。
    筆者的測(cè)試平臺(tái)是Windows 2000 Server,沒有配置任何Service Pack,使用的JDK版本是1.3.0版本。筆者試圖通過查看JDK目錄下src.jar中附帶的源碼找到引起問題的原因,但是發(fā)現(xiàn)有關(guān)的操作被封裝在 sun.misc包中,而src.jar文件沒有提供該包中任何類的源碼。本文把這個(gè)問題提出來,希望與有關(guān)開發(fā)人員一起探討。
    posted @ 2005-12-14 10:57 javaGrowing 閱讀(393) | 評(píng)論 (0)編輯 收藏

         摘要: 侯捷觀點(diǎn) Java反射機(jī)制   摘要 Reflection 是Java被視為動(dòng)態(tài)(或準(zhǔn)動(dòng)態(tài))語言的一個(gè)關(guān)鍵性質(zhì)。這個(gè)機(jī)制允許程序在運(yùn)行時(shí)透過Reflection APIs取得任何一個(gè)已知名稱的class的內(nèi)部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實(shí)現(xiàn)之interfaces(例如Cloneable),也包括fie...  閱讀全文
    posted @ 2005-12-09 16:58 javaGrowing 閱讀(942) | 評(píng)論 (1)編輯 收藏

    認(rèn)識(shí).NET的集合 - 開發(fā)者 - ZDNet China


    認(rèn)識(shí).NET的集合

    作者: BUILDER.COM
    Wednesday, May 15 2002 11:06 AM

     集合(collection)提供了一種結(jié)構(gòu)化組織任意對(duì)象的方式,而且我們?cè)缇椭兰显谌粘>幊坦ぷ髦械闹匾浴?NET類庫提供了豐富的集合數(shù)據(jù)類型,其種類之繁多甚至使許多人看得眼都花了,這些集合對(duì)象都具有各自的專用場(chǎng)合。不管怎么說,更多的選擇也就意味著更高的靈活性,但同時(shí)也意味著更高的復(fù)雜性。因此,對(duì)集合各個(gè)類型的用途和使用條件具有適度的了解是完全必要的。下面就請(qǐng)隨我進(jìn)行一場(chǎng).NET集合之旅吧!

    .NET集合定義


    從.NET的角度看,所謂的集合可以定義為一種對(duì)象,這種對(duì)象實(shí)現(xiàn)一個(gè)或者多個(gè)System.Collections.ICollectionSystem.Collections.IDictionarySystem.Collections.IList接口。這一定義把System.Collections名稱空間中的“內(nèi)置”集合劃分成了三種類別:

    • 有序集合:僅僅實(shí)現(xiàn)ICollection接口的集合,在通常情況下,其數(shù)據(jù)項(xiàng)目的插入順序控制著從集合中取出對(duì)象的的順序。System.Collections.Stack和 System.Collections.Queue類都是ICollection集合的典型例子。
    • 索引集合:實(shí)現(xiàn)Ilist的集合,其內(nèi)容能經(jīng)由從零開始的數(shù)字檢索取出,就象數(shù)組一樣。System.Collections.ArrayList對(duì)象是索引集合的一個(gè)例子。
    • 鍵式集合:實(shí)現(xiàn) IDictionary 接口的集合,其中包含了能被某些類型的鍵值檢索的項(xiàng)目。IDictionary集合的內(nèi)容通常按鍵值方式存儲(chǔ),可以用枚舉的方式排序檢索。 System.Collections.HashTable類實(shí)現(xiàn)了IDictionary 接口。

    正如你看到的那樣,給定集合的功能在很大程度上受到特定接口或其實(shí)現(xiàn)接口的控制。如果你對(duì)面向?qū)ο缶幊倘狈α私猓敲茨憧赡軐?duì)上面說的這些話感到難以理解。不過你至少應(yīng)該知道,以接口這種方式構(gòu)造對(duì)象的功能不但造就了具有整套類似方法的對(duì)象族,而且還能讓這些對(duì)象在必要的情況下可以當(dāng)作同類,以O(shè)OP(面向?qū)ο缶幊蹋┑男g(shù)語來說,這就是大名鼎鼎的多態(tài)性技術(shù)。

    System.Collections概述

    System.Collections名稱空間包含了在你的應(yīng)用程序中可以用到的6種內(nèi)建通用集合。另一些更為專業(yè)化的集合則歸屬于System.Collections.Specialized,在某些情況下你會(huì)發(fā)現(xiàn)這些專用集合也是非常有用的。加上一些異常(exception)類,這些專業(yè)化集合在功能上和內(nèi)建集合是類似的。現(xiàn)在就讓我們審視一下通用集合以及少量的不太富于專業(yè)化的集合。

    堆棧和隊(duì)列

    System.Collections.Stack 和 System.Collections.Queue 類,兩者僅僅實(shí)現(xiàn)了ICollection 接口,按照存儲(chǔ)項(xiàng)目加到集合的順序保存System.Object類型的項(xiàng)目。對(duì)象只能按其加入順序從集合中檢索:堆棧是后進(jìn)先出,而隊(duì)列則是先進(jìn)先出。通常情況下,你在以下場(chǎng)合可以考慮采用以上這些集合:

    • 接收和處理集合內(nèi)項(xiàng)目時(shí)順序比較重要。
    • 你能在處理項(xiàng)目之后丟棄它。
    • 你不需要訪問集合中的任意項(xiàng)目。

    ArrayList

    System.Collections.ArrayList類,僅僅實(shí)現(xiàn) Ilist,最適合描述為一種正常數(shù)組和集合的混合類型。ArrayList按照項(xiàng)目被加入集合的順序存儲(chǔ)項(xiàng)目。每個(gè)項(xiàng)目都被分配一個(gè)索引標(biāo)識(shí)符而且能由關(guān)聯(lián)它們的索引數(shù)字以任何順序被檢索。當(dāng)新項(xiàng)目加入集合時(shí)會(huì)擴(kuò)大ArrayList從而令其相比普通數(shù)組更具靈活性。然而,ArrayList負(fù)載比傳統(tǒng)數(shù)組更大而且沒有實(shí)現(xiàn)嚴(yán)格的類型化,也就可以接受任何轉(zhuǎn)換為System.Object的對(duì)象(換句話說,對(duì)什么東西都來者不拒)。

    SortedList

    System.Collections.SortedList,它實(shí)現(xiàn)了IDictionary和ICollection接口,是最基本的排序集合,與Vb6下的Collection對(duì)象非常類似。SortedList存儲(chǔ)對(duì)象并按照關(guān)聯(lián)的鍵值對(duì)這些存儲(chǔ)對(duì)象排序。它們也是同時(shí)支持索引數(shù)字和鍵對(duì)象檢索的唯一內(nèi)建的.NET集合。

    HashTable

    強(qiáng)有力的System.Collections.HashTable集合實(shí)現(xiàn)了IDictionary 和 Icollection,能用來存儲(chǔ)多種類型的對(duì)象連同關(guān)聯(lián)的唯一字符串鍵值。在HashTable集合中的項(xiàng)目按照源自其鍵值的哈希代碼所確定的順序存儲(chǔ)。集合內(nèi)每個(gè)對(duì)象的鍵值都必須唯一,而其哈希代碼則不一定唯一。


    什么是哈希代碼?
    哈希代碼實(shí)質(zhì)上就是從一快數(shù)據(jù)中消除所有冗余部分之后的結(jié)果,它主要起到對(duì)數(shù)據(jù)輔助分類或排序的作用。

    當(dāng)某個(gè)項(xiàng)目加入集合時(shí),HashTable即調(diào)用鍵值的GetHashCode方法,由于所有的類都是從System.Objec繼承的,所以調(diào)用該方法即可確定該類的哈希代碼并且按該代碼排序存儲(chǔ)。你可以強(qiáng)迫使用定制的哈希函數(shù),方法有二,一是重載類的GetHashCode方法,二是向HashTable構(gòu)造器傳遞實(shí)現(xiàn)了System.Collections.IHashcodeProvider接口的對(duì)象,在這種情況下,該對(duì)象將用于為所有加入集合的鍵值產(chǎn)生哈希代碼。

    從性能的角度看,因?yàn)殒I值搜索僅限于具有同樣哈希代碼的鍵值,所以HashTable能夠很快地從集合中檢索任意一個(gè)元素,從而減少了必須通過檢查以發(fā)現(xiàn)匹配的鍵值的數(shù)量。然而,因?yàn)椴迦氲郊现械拿總€(gè)對(duì)象-鍵值對(duì)都必須產(chǎn)生相應(yīng)的哈希代碼,所以項(xiàng)目插入的代價(jià)就有點(diǎn)高了。因此,HashTable主要運(yùn)用在按照任意鍵值反復(fù)檢索大量相對(duì)靜態(tài)的數(shù)據(jù)這一場(chǎng)合下。

    ListDictionary 和 HybridDictionary

    ListDictionary 和 HybridDictionary 類歸屬于System.Collections.Specialized。它們都在按照唯一鍵值的原則來組織項(xiàng)目,而且都實(shí)現(xiàn)了 IDictionary 和 ICollection 。ListDictionary在內(nèi)部以鏈表的方式存儲(chǔ)項(xiàng)目,建議用在不會(huì)增長(zhǎng)超過10個(gè)項(xiàng)目的集合中。HybridDictionary采用一個(gè)內(nèi)部鏈表(實(shí)際上就是ListDictionary)作為小集合,當(dāng)集合變得足夠大(超過10個(gè)項(xiàng)目)以至于鏈表實(shí)現(xiàn)效率降低時(shí)就會(huì)轉(zhuǎn)換為HashTable。

    StringCollection 和 StringDictionary

    System.Collections.Specialized.StringCollection 和 System.Collections.Specialized.StringDictionary 都對(duì)存儲(chǔ)字符串的集合進(jìn)行了優(yōu)化。 StringCollection實(shí)現(xiàn)了 IList 和 ICollection 而且實(shí)質(zhì)上就是ArrayList,只不過實(shí)現(xiàn)了強(qiáng)烈的類型化僅僅接受字符串而已。StringCollection最理想的應(yīng)用場(chǎng)合是經(jīng)常更新或增加的少量數(shù)據(jù),而StringDictionary則最適用于不經(jīng)常增加項(xiàng)目到諸如HashTable之類集合中的大量數(shù)據(jù)。

    NameValueCollection

    System.Collections.Specialized.NameValueCollection最有趣的地方在于它能包含關(guān)聯(lián)同一鍵值的多個(gè)項(xiàng)目,這正是它與其他內(nèi)建集合的差別所在。除此以外,它在功能上類似HashTable,按照源自每一項(xiàng)目鍵值的哈希代碼對(duì)項(xiàng)目排序從而也具有類同的優(yōu)缺點(diǎn)。

    存在的問題

    如果說由 .NET 類庫所提供的內(nèi)建集合也存在問題的話,那多半是它們幾乎都在內(nèi)部把項(xiàng)目存儲(chǔ)為System.Object.類型。從最大靈活性的角度看那是一個(gè)好想法,但同時(shí)也給采用這些通用集合的程序員提出了一些問題。首先,只要你把一個(gè)新項(xiàng)目加到集合中去,運(yùn)行時(shí)就必須實(shí)施類型轉(zhuǎn)換操作(創(chuàng)建值類型的索引以便可以當(dāng)作對(duì)象引用)。這是一種低效的操作而且在處理大型集合時(shí)會(huì)產(chǎn)生相當(dāng)可觀的性能問題。其次,只要你訪問通用集合中的一個(gè)項(xiàng)目,該項(xiàng)目都將作為System.Object類型被返回,這就意味著你不得不把它轉(zhuǎn)換為真實(shí)的類型才能對(duì)其進(jìn)行有意義的操作。

    責(zé)任編輯:炒飯

    posted @ 2005-12-09 11:32 javaGrowing 閱讀(363) | 評(píng)論 (0)編輯 收藏

    數(shù)組與其它容器的區(qū)別體現(xiàn)在三個(gè)方面:效率,類型識(shí)別以及可以持有primitives.

    數(shù)組是java提供的,是能隨機(jī)存儲(chǔ)和訪問reference序列的諸多方法中,最高效的一種。數(shù)組是線形序列,所以它可以快速訪問其中的元素,但速度是有代價(jià)的,當(dāng)你創(chuàng)建了一個(gè)數(shù)組之后它的容量就固定了,而且在其生命周期里不能改變。也許你會(huì)提議先創(chuàng)建一個(gè)數(shù)組,等到快不夠用的時(shí)候,再創(chuàng)建一個(gè)新的,然后將舊數(shù)組里的reference 全部導(dǎo)到新的里面。其實(shí)ArrayList 就是這么做的。但是這種靈活性所帶來的開銷,使得ArrayList 的效率比       起數(shù)組有了明顯下降。      

    在我們寫程序的時(shí)候往往不知道要用多少對(duì)象,或者要用一種更復(fù)雜方式來存儲(chǔ)對(duì)象情況。為此,Java 提供了“容器類(container class)”。其基本類型有List, Set Map。有了這些工具,你就能解決很多問題了。它們還有一些別的特性。比方說Set 所持有的對(duì)象,個(gè)個(gè)都不同,Map則是一個(gè)“關(guān)聯(lián)性數(shù)組(associative array)”,它能在兩個(gè)對(duì)象之間建立聯(lián)系。此外,與數(shù)組不同,它們還能自動(dòng)調(diào)整大小,所以你可以往里面放任意數(shù)量的對(duì)象。這樣寫程序的時(shí)候,就不用操心要開多大的空間了。

     

    Java2 的容器類要解決“怎樣持有對(duì)象”,而它把這個(gè)問題分成兩類:

    1. Collection: 通常是一組有一定規(guī)律的獨(dú)立元素。List 必須按照特定的順序持有這些元素,而Set 則不能保存重復(fù)的元素。(bag沒有這個(gè)限制,但是Java的容器類庫沒有實(shí)現(xiàn)它,因?yàn)?/span>List 已經(jīng)提供這種功能了。)

    2. Map: 一組以“鍵——值”(key-value)形式出現(xiàn)的pair。初看上去,它應(yīng)該是一個(gè)pairCollection,但是真這么去做的話,它就會(huì)變得很滑稽,所以還是把這個(gè)概念獨(dú)立列出來為好。退一步說,真的要用到Map 的某個(gè)子集的時(shí)候,創(chuàng)建一個(gè)Collection 也是很方便的。Map可以返回“鍵(key)的”Set,值的Collection,或者pairSet。和數(shù)組一樣,Map 不需要什么修改,就能很容易地?cái)U(kuò)展成多維。你只要直接把Map 的值設(shè)成Map 就可以了(然后它的值再是Map,以此類推)。我們先來看看容器的一般特性,然后深入細(xì)節(jié),最后再看什么會(huì)有這么多版本,以及如何進(jìn)行選擇。

     

    List 會(huì)老老實(shí)實(shí)地持有你所輸入的所有對(duì)象,既不做排序也不做編輯。Set 則每個(gè)對(duì)象只接受一次,而且還要用它自己的規(guī)則對(duì)元素進(jìn)行重新排序(一般情況下,你關(guān)心的只是Set 包沒包括某個(gè)對(duì)象,而不是它到底排在哪里——如果是那樣,你最好還是用List)。而Map 也不接收重復(fù)的pair,至于是不是重復(fù),要由key來決定。此外,它也有它自己的內(nèi)部排序規(guī)則,不會(huì)受輸入順序影響。如果插入順序是很重要的,那你就只能使用LinkedHashSet LinkedHashMap 了。

    test.bmp

    第一眼看到這張圖的時(shí)候,你會(huì)覺得很震撼。不過你馬上就會(huì)知道,實(shí)際上只有三種容器組件——Map,List 和Set,而每種又有兩到三個(gè)實(shí)現(xiàn)。最常用的幾個(gè)容器已經(jīng)用粗黑線框了起來。看到這里,這張圖就不再那么令人望而生畏了。
    用點(diǎn)號(hào)框起來的是interface,用虛線框起來的是abstract 類,實(shí)線
    則表示普通的(“實(shí)體concrete”)類。點(diǎn)線的箭頭表示類實(shí)現(xiàn)了這個(gè)interface(或者,abstract 類表示部分實(shí)現(xiàn)了這個(gè)interface)。實(shí)線
    箭頭表示這個(gè)類可以制造箭頭所指的那個(gè)類的對(duì)象。比如,Collection
    能制造Iterator,而List 還能制造ListIterator(也能制造Iterator,因?yàn)長(zhǎng)ist 是繼承自Collection 的)。
    與存放對(duì)象有關(guān)的接口包括Collection,List,Set 和Map。在理想情況下,絕大多數(shù)代碼應(yīng)該只同這些接口打交道,只是在創(chuàng)建容器的時(shí)候才要精確地指明它的確切類型。所以你可以這樣創(chuàng)建一個(gè)List。
    List x = new LinkedList( );

    當(dāng)然,你也可以選擇讓x 成為L(zhǎng)inkedList(而不是泛型的List),這樣x 就帶上了準(zhǔn)確的類型信息interface 的優(yōu)雅 (同時(shí)也是它的本意)就在于,你想修改具體的實(shí)現(xiàn)的時(shí)候,只要改一下創(chuàng)建的聲明就可以了,就
    像這樣:
    List x = new ArrayList( );
    無需驚動(dòng)其它代碼(用迭代器也能獲得一些這種泛型性)。這個(gè)類系里面有很多以“Abstract”開頭的類,初看起來這可能會(huì)讓人有點(diǎn)不明白。實(shí)際上它們只是一些部分實(shí)現(xiàn)某個(gè)接口的辦成品。假如你要編一個(gè)你自己的Set,不要從Set 接口開始挨個(gè)實(shí)現(xiàn)它的方法;相反你最好繼承AbstractSet,這樣就能把編程的工作量壓縮到最低了。但是,實(shí)際上容器類庫的功能已經(jīng)夠強(qiáng)的了,我們要求的事情它幾乎都能做
    到。所以對(duì)我們來說,你完全可以忽略以“Abstract”開頭的類。

    List 的功能
    正如你從ArrayList 那里所看到的,List 的基本用法是相當(dāng)簡(jiǎn)單的。雖然絕大多數(shù)時(shí)候,你只是用add( )加對(duì)象,用get( )取對(duì)象,用iterator( )獲取這個(gè)序列的Iterator,但List 還有一些別的很有用的
    方法。
    實(shí)際上有兩種List:擅長(zhǎng)對(duì)元素進(jìn)行隨機(jī)訪問的,較常用的ArrayList,和更強(qiáng)大的LinkedList。LinkedList 不是為快速的隨機(jī)訪問而設(shè)計(jì)的,但是它卻有一組更加通用的方法。

    List (接口) List 的最重要的特征就是有序;它會(huì)確保以一定的順序保存元素。List 在Collection 的基礎(chǔ)上添加了大量方法,使之能在序列中間插入和刪除元素。(只對(duì)LinkedList 推薦使用。)List 可以制造ListIterator 對(duì)象,你除了能用它在List 的中間插入和刪除元素之外,還能用它沿兩個(gè)方向遍歷List。
    ArrayList*一個(gè)用數(shù)組實(shí)現(xiàn)的List。能進(jìn)行快速的隨機(jī)訪問, 但是往列表中間插入和刪除元素的時(shí)候比較慢。ListIterator 只能用在反向遍歷ArrayList 的場(chǎng) 合,不要用它來插入和刪除元素,因?yàn)橄啾萀inkedList,在ArrayList 里面用ListIterator 的系統(tǒng)開銷比較高。
    LinkedList對(duì)順序訪問進(jìn)行了優(yōu)化。在List 中間插入和刪除元 素的代價(jià)也不高。隨機(jī)訪問的速度相對(duì)較慢。(用ArrayList 吧。)此外它還有addFirst( ), addLast( ),getFirst( ),getLast( ), removeFirst( )和removeLast( )等方法(這些 方法,接口和基類均未定義),你能把它當(dāng)成棧(stack),隊(duì)列(queue)或雙向隊(duì)列(deque)來用。 下面這段程序把各種操作都集中到方法里面:List 都能作的事(basicTest( )),用Iterator 在列表中移動(dòng)(iterMotion( )),修改 列表的元素(iterManipulation( )),查看List 的操作結(jié)果(testVisual( )),以及LinkedList 所獨(dú)有的方法。
    Set 的功能
    Set 的接口就是Collection 的,所以不像那兩個(gè)List,它沒有額外的
    功能。實(shí)際上Set 確確實(shí)實(shí)就是一個(gè)Collection——只不過行為方式不
    同罷了。(這是繼承和多態(tài)性的完美運(yùn)用:表達(dá)不同地行為。)Set 會(huì)拒絕
    持有多個(gè)具有相同值的對(duì)象的實(shí)例(對(duì)象的“值”又是由什么決定的呢?
    這個(gè)問題比較復(fù)雜,我們以后會(huì)講的)。
    Set (接口)加入Set 的每個(gè)元素必須是唯一的;否則, Set 是不會(huì)把它加進(jìn)去的。要想加進(jìn)Set, Object 必須定義equals( ),這樣才能標(biāo)明對(duì)象的唯一性。Set 的接口和Collection 的
    一模一樣。Set 的接口不保證它會(huì)用哪種順序來存儲(chǔ)元素。
    HashSet* 為優(yōu)化查詢速度而設(shè)計(jì)的Set。要放進(jìn)HashSet 里面的Object 還得定義hashCode( )。
    TreeSet 是一個(gè)有序的Set,其底層是一棵樹。這樣你 就能從Set 里面提取一個(gè)有序序列了。
    LinkedHashSet(JDK 1.4) 一個(gè)在內(nèi)部使用鏈表的Set,既有HashSet 的查詢速度,又能保存元素被加進(jìn)去的順序(插入順序)。用Iterator 遍歷Set 的時(shí)候, 它是按插入順序進(jìn)行訪問的。
    Map 的功能
    ArrayList 能讓你用數(shù)字在一個(gè)對(duì)象序列里面進(jìn)行選擇,所以從某種意義上講,它是將數(shù)字和對(duì)象關(guān)聯(lián)起來。但是,如果你想根據(jù)其他條件在一個(gè)對(duì)象序列里面進(jìn)行選擇的話,那又該怎么做呢?從概念上講,它看上去像是一個(gè)ArrayList,但它不用數(shù)字,而是用另一個(gè)對(duì)象來查找對(duì)象!這是一種至關(guān)重要的編程技巧。這一概念在Java 中表現(xiàn)為Map。put(Object key, Object value)方法會(huì)往Map 里面加一個(gè)值,并且把這個(gè)值同鍵(你查找時(shí)所用的對(duì)象)聯(lián)系起來。給出鍵之后,get(Object key)就會(huì)返回與之相關(guān)聯(lián)的值。
    你也可以用containsKey( ) 和 containsValue( )測(cè)試Map 是否包含有某個(gè)鍵或值。
    Java 標(biāo)準(zhǔn)類庫里有好幾種Map:HashMap,TreeMap, LinkedHashMap,WeakHashMap,IdentityHashMap。
    它們都實(shí)現(xiàn)了Map 的基本接口,但是在行為方式方面有著明顯的差異。這些差異體現(xiàn)在,效率,持有和表示對(duì)象pair 的順序,持有對(duì)象的時(shí)間長(zhǎng)短,以及如何決定鍵的相等性。性能是Map 所要面對(duì)的一個(gè)大問題。如果你知道get( )是怎么工作的,你就會(huì)發(fā)覺(比方說)在ArrayList 里面找對(duì)象會(huì)是相當(dāng)慢的。而這
    正是HashMap 的強(qiáng)項(xiàng)。它不是慢慢地一個(gè)個(gè)地找這個(gè)鍵,而是用了一種被稱為hash code的特殊值來進(jìn)行查找的。散列(hash)是一種算法,它會(huì)從目標(biāo)對(duì)象當(dāng)中提取一些信息,然后生成一個(gè)表示這個(gè)對(duì)象的“相對(duì)
    獨(dú)特”的int。hashCode( )是Object 根類的方法,因此所有Java對(duì)象都能生成hash code。HashMap 則利用對(duì)象的hashCode( )來進(jìn)行快速的查找。這樣性能就有了急劇的提高。

    Map (接口)維持鍵-值的關(guān)聯(lián)(即pairs),這樣就能用鍵來找值了。
    HashMap* 基于hash表的實(shí)現(xiàn)。(用它來代替Hashtable。)提供時(shí)間恒定的插入與查詢。在構(gòu)造函數(shù)中可以設(shè)置 hash表的capacity 和load factor。可以通過構(gòu)造 函數(shù)來調(diào)節(jié)其性能。
    LinkedHashMap(JDK 1.4) 很像HashMap,但是用Iterator 進(jìn)行 遍歷的時(shí)候,它會(huì)按插入順序或最先使用 的順序(least-recently-used (LRU) order)進(jìn)行訪問。除了用Iterator 外, 其他情況下,只是比HashMap 稍慢一 點(diǎn)。用Iterator 的情況下,由于是使用 鏈表來保存內(nèi)部順序,因此速度會(huì)更快。
    TreeMap 基于紅黑樹數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。當(dāng)你查看鍵 或pair 時(shí),會(huì)發(fā)現(xiàn)它們是按順序 (根據(jù)Comparable 或Comparator,我們過 一會(huì)講)排列的。TreeMap 的特點(diǎn)是,你 所得到的是一個(gè)有序的Map。TreeMap 是Map 中唯一有subMap( )方法的實(shí) 現(xiàn)。這個(gè)方法能讓你獲取這個(gè)樹中的一部 分。
    WeakHashMap 一個(gè)weak key的Map,是為某些特殊問 題而設(shè)計(jì)的。它能讓Map 釋放其所持有的 對(duì)象。如果某個(gè)對(duì)象除了在Map 當(dāng)中充當(dāng) 鍵之外,在其它地方都沒有其reference 的話,那它將被當(dāng)作垃圾回收。
    IdentityHashMap(JDK 1.4) 一個(gè)用==,而不是equals( )來比較鍵 的hash map。不是為我們平常使用而設(shè) 計(jì)的,是用來解決特殊問題的。 散列是往Map 里存數(shù)據(jù)的常用算法。有時(shí)你會(huì)需要知道散列算法的工作 細(xì)節(jié),所以我們會(huì)稍后再講。
    posted @ 2005-12-09 11:09 javaGrowing 閱讀(2732) | 評(píng)論 (1)編輯 收藏

    "^\d+$"  //非負(fù)整數(shù)(正整數(shù) + 0)

    "^[0-9]*[1-9][0-9]*$"  //正整數(shù)

    "^((-\d+)|(0+))$"  //非正整數(shù)(負(fù)整數(shù) + 0)

    "^-[0-9]*[1-9][0-9]*$"  //負(fù)整數(shù)

    "^-?\d+$"    //整數(shù)

    "^\d+(\.\d+)?$"  //非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)

    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮點(diǎn)數(shù)

    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)

    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //負(fù)浮點(diǎn)數(shù)

    "^(-?\d+)(\.\d+)?$"  //浮點(diǎn)數(shù)

    "^[A-Za-z]+$"  //由26個(gè)英文字母組成的字符串

    "^[A-Z]+$"  //由26個(gè)英文字母的大寫組成的字符串

    "^[a-z]+$"  //由26個(gè)英文字母的小寫組成的字符串

    "^[A-Za-z0-9]+$"  //由數(shù)字和26個(gè)英文字母組成的字符串

    "^\w+$"  //由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串

    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址

    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url

    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日

    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年

    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil

    "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //電話號(hào)碼

    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址

    匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]

    匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]

    匹配空行的正則表達(dá)式:\n[\s| ]*\r

    匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*<\/\1>|<(.*) \/>/

    匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)

    匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

    匹配網(wǎng)址URL的正則表達(dá)式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$

    匹配帳號(hào)是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

    匹配國內(nèi)電話號(hào)碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?

    匹配騰訊QQ號(hào):^[1-9]*[1-9][0-9]*$

    下表是元字符及其在正則表達(dá)式上下文中的行為的一個(gè)完整列表:

    \ 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符、或一個(gè)后向引用、或一個(gè)八進(jìn)制轉(zhuǎn)義符。

    ^ 匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對(duì)象的Multiline 屬性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。

    $ 匹配輸入字符串的結(jié)束位置。如果設(shè)置了 RegExp 對(duì)象的Multiline 屬性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。

    * 匹配前面的子表達(dá)式零次或多次。

    + 匹配前面的子表達(dá)式一次或多次。+ 等價(jià)于 {1,}。

    ? 匹配前面的子表達(dá)式零次或一次。? 等價(jià)于 {0,1}。

    {n} n 是一個(gè)非負(fù)整數(shù),匹配確定的n 次。

    {n,} n 是一個(gè)非負(fù)整數(shù),至少匹配n 次。

    {n,m} m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗號(hào)和兩個(gè)數(shù)之間不能有空格。

    ? 當(dāng)該字符緊跟在任何一個(gè)其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。

    . 匹配除 "\n" 之外的任何單個(gè)字符。要匹配包括 ’\n’ 在內(nèi)的任何字符,請(qǐng)使用象 ’[.\n]’ 的模式。

    (pattern) 匹配pattern 并獲取這一匹配。

    (?:pattern) 匹配pattern 但不獲取匹配結(jié)果,也就是說這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。

    (?=pattern) 正向預(yù)查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。

    (?!pattern) 負(fù)向預(yù)查,與(?=pattern)作用相反

    x|y 匹配 x 或 y。

    [xyz] 字符集合。

    [^xyz] 負(fù)值字符集合。

    [a-z] 字符范圍,匹配指定范圍內(nèi)的任意字符。

    [^a-z] 負(fù)值字符范圍,匹配任何不在指定范圍內(nèi)的任意字符。

    \b 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。

    \B 匹配非單詞邊界。

    \cx 匹配由x指明的控制字符。

    \d 匹配一個(gè)數(shù)字字符。等價(jià)于 [0-9]。

    \D 匹配一個(gè)非數(shù)字字符。等價(jià)于 [^0-9]。

    \f 匹配一個(gè)換頁符。等價(jià)于 \x0c 和 \cL。

    \n 匹配一個(gè)換行符。等價(jià)于 \x0a 和 \cJ。

    \r 匹配一個(gè)回車符。等價(jià)于 \x0d 和 \cM。

    \s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于[ \f\n\r\t\v]。

    \S 匹配任何非空白字符。等價(jià)于 [^ \f\n\r\t\v]。

    \t 匹配一個(gè)制表符。等價(jià)于 \x09 和 \cI。

    \v 匹配一個(gè)垂直制表符。等價(jià)于 \x0b 和 \cK。

    \w 匹配包括下劃線的任何單詞字符。等價(jià)于’[A-Za-z0-9_]’。

    \W 匹配任何非單詞字符。等價(jià)于 ’[^A-Za-z0-9_]’。

    \xn 匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長(zhǎng)。

    \num 匹配 num,其中num是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。

    \n 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 \n 之前至少 n 個(gè)獲取的子表達(dá)式,則 n 為后向引用。否則,如果 n 為八進(jìn)制數(shù)字 (0-7),則 n 為一個(gè)八進(jìn)制轉(zhuǎn)義值。

    \nm 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)后向引用。如果 \nm 之前至少有is preceded by at least nm 個(gè)獲取得子表達(dá)式,則 nm 為后向引用。如果 \nm 之前至少有 n 個(gè)獲取,則 n 為一個(gè)后跟文字 m 的后向引用。如果前面的條件都不滿足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 \nm 將匹配八進(jìn)制轉(zhuǎn)義值 nm。

    \nml 如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字 (0-7),則匹配八進(jìn)制轉(zhuǎn)義值 nml。

    \un 匹配 n,其中 n 是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的Unicode字符。

    匹配中文字符的正則表達(dá)式: [u4e00-u9fa5]

    匹配雙字節(jié)字符(包括漢字在內(nèi)):[^x00-xff]

    應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)

    String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}

    匹配空行的正則表達(dá)式:n[s| ]*r

    匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*|<(.*) />/

    匹配首尾空格的正則表達(dá)式:(^s*)|(s*$)

    應(yīng)用:javascript中沒有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來實(shí)現(xiàn),如下:

    String.prototype.trim = function()

    { return this.replace(/(^s*)|(s*$)/g, "");

    } 利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:

    下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值的Javascript程序:

    function IP2V(ip)

    { re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達(dá)式 if(re.test(ip)) { return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 } else { throw new Error("Not a valid IP address!") } }

    不過上面的程序如果不用正則表達(dá)式,而直接用split函數(shù)來分解可能更簡(jiǎn)單,程序如下:

    var ip="10.100.20.168"

    ip=ip.split(".")

    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

    匹配Email地址的正則表達(dá)式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

    匹配網(wǎng)址URL的正則表達(dá)式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

    利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:

    var s="abacabefgeeii" var s1=s.replace(/(.).*1/g,"$1") var re=new RegExp("["+s1+"]","g") var s2=s.replace(re,"") alert(s1+s2) //結(jié)果為:abcefgi

    我原來在CSDN上發(fā)貼尋求一個(gè)表達(dá)式來實(shí)現(xiàn)去除重復(fù)字符的方法,最終沒有找到,這是我能想到的最簡(jiǎn)單的實(shí)現(xiàn)方法。思路是使用后向引用取出包括重復(fù)的字符,再以重復(fù)的字符建立第二個(gè)表達(dá)式,取到不重復(fù)的字符,兩者串連。這個(gè)方法對(duì)于字符順序有要求的字符串可能不適用。

    得用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1

    s="http://www.9499.net/page1.htm" s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") alert(s) 利用正則表達(dá)式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:

    用正則表達(dá)式限制只能輸入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"

    用 正則表達(dá)式限制只能輸入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字:onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"

    posted @ 2005-12-08 13:53 javaGrowing 閱讀(482) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共19頁: First 上一頁 11 12 13 14 15 16 17 18 19 下一頁 
    主站蜘蛛池模板: 亚洲一区二区影视| 亚洲毛片免费观看| 国产99视频精品免费视频76| 搡女人真爽免费视频大全| 亚洲制服丝袜第一页| 免费看成人AA片无码视频羞羞网| 7777久久亚洲中文字幕蜜桃 | 亚洲精品美女久久久久99| 一级毛片a免费播放王色电影 | 天天影院成人免费观看| 亚洲电影中文字幕| 日本视频免费高清一本18| 亚洲午夜在线电影| 114级毛片免费观看| 亚洲小说图片视频| 无码人妻一区二区三区免费| 亚洲人精品亚洲人成在线| 9久9久女女免费精品视频在线观看| 国产精品亚洲综合久久| 亚洲高清国产拍精品青青草原| 一级黄色毛片免费看| 亚洲精品国产精品乱码在线观看| 中文字幕乱码一区二区免费| 久久精品蜜芽亚洲国产AV| 免费99精品国产自在现线| WWW国产亚洲精品久久麻豆| 国产91精品一区二区麻豆亚洲| 日本视频免费高清一本18| 亚洲依依成人亚洲社区| 亚洲国产精品一区二区九九| 久久精品国产大片免费观看| 亚洲成人激情小说| 久久久久噜噜噜亚洲熟女综合 | 暖暖日本免费中文字幕| 亚洲国产精品人久久电影| 免费一看一级毛片人| 无码人妻久久一区二区三区免费 | 亚洲国产日韩一区高清在线| 成**人免费一级毛片| 久久免费99精品国产自在现线| 亚洲第一网站免费视频|