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

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

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

    Sunspl

    Hello,everyone,i am sun. 天道酬勤,笨鳥先飛.
    隨筆 - 47, 文章 - 0, 評論 - 24, 引用 - 0
    數據加載中……

    equals 與 ==

    初學 Java 有段時間了,感覺似乎開始入了門,有了點兒感覺
    但是發現很多困惑和疑問而且均來自于最基礎的知識
    折騰了一陣子又查了查書,終于對 String 這個特殊的對象有了點感悟

    大家先來看看一段奇怪的程序:
    public class TestString {
        public static void main(String[] args) {
            String s1 = "Monday";
            String s2 = "Monday";
        }
    }
    這個程序真是簡單啊!可是有什么問題呢?

    1. 來自 String 的憂慮
    上面這段程序中,到底有幾個對象呢?
    可能很多人脫口而出:兩個,s1 和 s2
    為什么?
    String 是 final 類,它的值不可變。
    看起來似乎很有道理,那么來檢測一下吧,稍微改動一下程序
    就可以看到結果了:

    public class TestString {
        public static void main(String[] args) {
            String s1 = "Monday";
            String s2 = "Monday";
            if (s1 == s2)
                System.out.println("s1 == s2");
            else
                System.out.println("s1 != s2");
        }
    }
    呵呵,很多人都會說已經不止兩個對象了
    編譯并運行程序,輸出:s1 == s2
    啊!
    為什么 s1 == s2 ?
    == 分明是在說:s1 與 s2 引用同一個 String 對象 -- "Monday"!

    2. 千變萬化的 String
    再稍微改動一下程序,會有更奇怪的發現:
    public class TestString {
        public static void main(String[] args) {
            String s1 = "Monday";
            String s2 = new String("Monday");
            if (s1 == s2)
                System.out.println("s1 == s2");
            else
                System.out.println("s1 != s2");
            if (s1.equals(s2))
                System.out.println("s1 equals s2");
            else
                System.out.println("s1 not equals s2");
        }
    }
    我們將 s2 用 new 操作符創建
    程序輸出:
    s1 != s2
    s1 equals s2
    嗯,很明顯嘛
    s1 s2分別引用了兩個"Monday"String對象
    可是為什么兩段程序不一樣呢?

    3. 在 String 的游泳池中游泳
    哈哈,翻了翻書終于找到了答案:
    原來,程序在運行的時候會創建一個字符串緩沖池
    當使用 s2 = "Monday" 這樣的表達是創建字符串的時候,程序首先會
    在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被
    放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1
    將 s2 引用 s1 所引用的對象"Monday"

    第二段程序中,使用了 new 操作符,他明白的告訴程序:
    “我要一個新的!不要舊的!”與是一個新的"Monday"Sting對象被創
    建在內存中。他們的值相同,但是位置不同,一個在池中游泳
    一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什么呢?

    4. 繼續潛水
    再次更改程序:
    public class TestString {
        public static void main(String[] args) {
            String s1 = "Monday";
            String s2 = new String("Monday");
            s2 = s2.intern();
            if (s1 == s2)
                System.out.println("s1 == s2");
            else
                System.out.println("s1 != s2");
            if (s1.equals(s2))
                System.out.println("s1 equals s2");
            else
                System.out.println("s1 not equals s2");
        }
    }
    這次加入:s2 = s2.intern();
    哇!程序輸出:
    s1 == s2
    s1 equals s2
    原來,程序新建了 s2 之后,又用intern()把他打翻在了池里
    哈哈,這次 s2 和 s1 有引用了同樣的對象了
    我們成功的減少了內存的占用

    5. == 與 equals() 的爭斗
    String 是個對象,要對比兩個不同的String對象的值是否相同
    明顯的要用到 equals() 這個方法
    可是如果程序里面有那么多的String對象,有那么多次的要用到 equals ,
    哦,天哪,真慢啊
    更好的辦法:
    把所有的String都intern()到緩沖池去吧
    最好在用到new的時候就進行這個操作
    String s2 = new String("Monday").intern();
    嗯,大家都在水池里泡著了嗎?哈哈
    現在我可以無所顧忌的用 == 來比較 String 對象的值了
    真是爽啊,又快又方便!
    關于String :)
    String 啊 String ,讓我說你什么好呢?
    你為我們 Java 程序員帶來所有的困擾還不夠嗎?
    看看 String 這一次又怎么鬧事兒吧

    1. 回顧一下壞脾氣的 String 老弟

    例程1:
    class Str {
        public static void main(String[] args) {
            String s = "Hi!";
            String t = "Hi!";
            if (s == t)
                System.out.println("equals");
            else
                System.out.println("not equals");
        }
    }

    程序輸出什么呢?
    如果看客們看過我的《來自 String 的困惑》之一
    相信你很快會做出正確的判斷:
    程序輸出:equals

    2. 哦,天哪,它又在攪混水了

    例程2:
    class Str {
        public static void main(String[] args) {
            String s = "HELLO";
            String t = s.toUpperCase();
            if (s == t)
                System.out.println("equals");
            else
                System.out.println("not equals");
        }
    }
    那么這個程序有輸出什么呢?
    慎重!再慎重!不要被 String 這個迷亂的家伙所迷惑!
    它輸出:equals
    WHY!!!

    把程序簡單的更改一下:
    class Str2 {
        public static void main(String[] args) {
            String s = "Hello";
            String t = s.toUpperCase();
            if (s == t)
                System.out.println("equals");
            else
                System.out.println("not equals");
        }
    }
    你可能會說:不是一樣嗎?
    不!千真萬確的,不一樣!這一次輸出:not equals

    Oh MyGOD!!!
    誰來教訓一下這個 String ??!

    3. 你了解你的馬嗎?
    “要馴服脫韁的野馬,就要了解它的秉性”牛仔們說道。
    你了解 String 嗎?

    解讀 String 的 API ,可以看到:
    toUpperCase() 和 toLowerCase() 方法返回一個新的String對象,
    它將原字符串表示字符串的大寫或小寫形勢;
    但是要注意:如果原字符串本身就是大寫形式或小寫形式,那么返回原始對象。
    這就是為什么第二個程序中 s 和 t 糾纏不清的緣故

    對待這個淘氣的、屢教不改的 String ,似乎沒有更好的辦法了
    讓我們解剖它,看看它到底有什么結構吧:

    (1) charAt(int n) 返回字符串內n位置的字符,第一個字符位置為0,
    最后一個字符的位置為length()-1,訪問錯誤的位置會扔出一塊大磚頭:
    StringIndexOutOfBoundsException 真夠大的

    (2) concat(String str) 在原對象之后連接一個 str ,但是返回一個新的 String 對象

    (3) EqualsIgnoreCase(String str) 忽略大小寫的 equals 方法
    這個方法的實質是首先調用靜態字符方法toUpperCase() 或者 toLowerCase()
    將對比的兩個字符轉換,然后進行 == 運算

    (4) trim() 返回一個新的對象,它將原對象的開頭和結尾的空白字符切掉
    同樣的,如果結果與原對象沒有差別,則返回原對象

    (5) toString() String 類也有 toString() 方法嗎?
    真是一個有趣的問題,可是如果沒有它,你的 String 對象說不定真的不能用在
    System.out.println() 里面啊
    小心,它返回對象自己

    String 類還有很多其他方法,掌握他們會帶來很多方便
    也會有很多困惑,所以堅持原則,是最關鍵的

    4. 我想買一匹更好的馬
    來購買更馴服溫和的 String 的小弟 StringBuffer 吧
    這時候會有人反對:它很好用,它效率很高,它怎么能夠是小弟呢?
    很簡單,它的交互功能要比 String 少,如果你要編輯字符串
    它并不方便,你會對它失望
    但這不意味著它不強大
    public final class String implements Serializable, Comparable, CharSequence
    public final class StringBuffer implements Serializable, CharSequence
    很明顯的,小弟少了一些東東,不過這不會干擾它的前途

    StringBuffer 不是由 String 繼承來的
    不過要注意兄弟它也是 final 啊,本是同根生

    看看他的方法吧,這么多穩定可靠的方法,用起來比頑皮的 String 要有效率的多
    ?br /> Java 為需要改變的字符串對象提供了獨立的 StringBuffer 類
    它的實例不可變(final),之所以要把他們分開
    是因為,字符串的修改要求系統的開銷量增大,
    占用更多的空間也更復雜,相信當有10000人擠在一個狹小的游泳池里游泳
    而岸邊又有10000人等待進入游泳池而焦急上火
    又有10000人在旁邊看熱鬧的時候,你這個 String 游泳池的管理員也會焦頭爛額

    在你無需改變字符串的情況下,簡單的 String 類就足夠你使喚的了,
    而當要頻繁的更改字符串的內容的時候,就要借助于宰相肚里能撐船的
    StringBuffer 了

    5. 宰相肚里能撐船
    (1) length() 與 capacity()
    String 中的 length() 返回字符串的長度
    兄弟 StringBuffer 也是如此,他們都由對象包含的字符長度決定

    capacity()呢?
    public class TestCapacity {
        public static void main(String[] args){
            StringBuffer buf = new StringBuffer("it was the age of wisdom,");
            System.out.println("buf = " + buf);
            System.out.println("buf.length() = " + buf.length());
            System.out.println("buf.capacity() = " + buf.capacity());
            String str = buf.toString();
            System.out.println("str = " + str);
            System.out.println("str.length() = " + str.length());
            buf.append(" " + str.substring(0,18)).append("foolishness,");
            System.out.println("buf = " + buf);
            System.out.println("buf.length() = " + buf.length());
            System.out.println("buf.capacity() = " + buf.capacity());
            System.out.println("str = " + str);
        }
    }
    程序輸出:
    buf = it was the age of wisdom.
    buf.length() = 25
    buf.capacity() = 41
    str = it was the age of wisdom
    str.length() = 25
    buf = it was the age of wisdom, it was the age of foolishness,
    buf.length() = 56
    buf.capacity() = 84
    str = it was the age of wisdom,

    可以看到,在內容更改之后,capacity也隨之改變了
    長度隨著向字符串添加字符而增加
    而容量只是在新的長度超過了現在的容量之后才增加
    StringBuffer 的容量在操作系統需要的時候是自動改變的
    程序員們對capacity所能夠做的僅僅是可以在初始化 StringBuffer對象的時候
    以上片斷引用自http://bbs.blueidea.com/viewthread.php?tid=945875&page=###
    解釋得比較形象和經典。具體的比較,要親自動手運行一下程序才行,如下為網上找到的專門研究equals和==的關系的程序,相信可從中體會出他們的深刻不同:
    String s1 = null;
    String s2 = null;
    System.out.println(s1==s2);//true
    //System.out.println(s1.equals(s2));//NullPointerException
    s1 = s2;
    System.out.println(s1==s2);//true
    //System.out.println(s1.equals(s2));//NullPointerException
    System.out.println("***1***");

    s1 = null;
    s2 = "";
    System.out.println(s1==s2);//false
    //System.out.println(s1.equals(s2));//NullPointerException
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***2***");

    s1 = "";
    s2 = null;
    System.out.println(s1==s2);//false
    System.out.println(s1.equals(s2));//false
    s1 = s2;
    System.out.println(s1==s2);//true
    //System.out.println(s1.equals(s2));//NullPointerException
    System.out.println("***3***");

    s1 = "";
    s2 = "";
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***4***");
    s1 = new String("");
    s2 = new String("");
    System.out.println(s1==s2);//false
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***5***");

    s1 = "null";
    s2 = "null";
    System.out.println(s1==s2);//ture
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***6***");
    s1 = new String("null");
    s2 = new String("null");
    System.out.println(s1==s2);//flase
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***7***");

    s1 = "abc";
    s2 = "abc";
    System.out.println(s1==s2);//ture
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***8***");
    s1 = new String("abc");
    s2 = new String("abc");
    System.out.println(s1==s2);//false
    System.out.println(s1.equals(s2));//true
    s1 = s2;
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println("***9***");

    總結:   多數情況下這兩者的區別就是究竟是對對象的引用進行比較還是對對象的值進行比較(其他特殊情況此處不予考慮)。==操作符是比較的對象的引用而不是對象的值。

    但在最初的Object對象中的equals方法與==操作符完成功能是相同的。
    源碼:
    java.lang.Object.equals()方法:
    -------------------------------------------------------------
    public boolean equalss(Object obj) {
     return (this = = obj);
        }
    -------------------------------------------------------------
    jdk文檔中給出如下解釋:
    -------------------------------------------------------------
    The equalss method implements an equivalence relation:
    · It is reflexive: for any reference value x, x.equalss(x) should return true.
    · It is symmetric: for any reference values x and y, x.equalss(y) should return true if and only if y.equalss(x) returns true.
    · It is transitive: for any reference values x, y, and z, if x.equalss(y) returns true and y.equalss(z) returns true, then x.equalss(z) should return true.
    · It is consistent: for any reference values x and y, multiple invocations of x.equalss(y) consistently return true or consistently return false, provided no information used in equalss comparisons on the object is modified.
    · For any non-null reference value x, x.equalss(null) should return false.
    The equalss method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any reference values x and y, this method returns true if and only if x and y refer to the same object (x==y has the value true).
    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equals objects must have equals hash codes.
    -------------------------------------------------------------

    對于String類的equals方法是對什么內容進行比較的呢?下面我們來看它的代碼和注釋:
    源代碼:
    -------------------------------------------------------------
    public boolean equals(Object anObject) {
     if (this == anObject) {
         return true;
     }
     if (anObject instanceof String) {
         String anotherString = (String)anObject;
         int n = count;
         if (n == anotherString.count) {
      char v1[] = value;
      char v2[] = anotherString.value;
      int i = offset;
      int j = anotherString.offset;
      while (n-- != 0) {
          if (v1[i++] != v2[j++])
       return false;
      }
      return true;
         }
     }
     return false;
        }


    -------------------------------------------------------------
    此方法的注釋為:
    -------------------------------------------------------------
    Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.
    -------------------------------------------------------------
    由上面的代碼和注釋可以得到String類的equal方法是對對象的值進行比較。
    根據以上的討論可以得出結論:equal方法和==操作符是否存在區別要個別對待,要根據equal的每個實現情況來具體判斷。

     

    posted @ 2008-06-11 22:36 JavaSuns 閱讀(735) | 評論 (0)編輯 收藏

    tomcat5.5jdbc 連接池配置(轉)

     

    tomcat5.5.9 jdbc 連接池配置時常會出現兩個錯誤:

    1.***not bound

    2.Cannot create JDBC driver of class '' for connect URL 'null'

    可以通過以下的方法達到正確的配置:

    1.現在%tomcat home%/conf/catalina/localhost 下面添加一段獨立的context xml段,命名為jasper.xml,例如

    <?xml version="1.0" encoding="UTF-8"?>
    <Context path="/jasper" docBase="jasper" debug="1" reloadable="true" crossContext="true">
    </Context>

    2.通過admin的界面(或手動在server.xml界面里進行配置)數據源,以sql2k為例,配置后的server.xml應該為

    <?xml version="1.0" encoding="UTF-8"?>
    <Server>
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
      <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
      <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
      <GlobalNamingResources>
        <Environment
          name="simpleValue"
          type="java.lang.Integer"
          value="30"/>
        <Resource
          auth="Container"
          description="User database that can be updated and saved"
          name="UserDatabase"
          type="org.apache.catalina.UserDatabase"
          pathname="conf/tomcat-users.xml"
          factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/>
        <Resource
          name="jdbc/Northwind"
          type="javax.sql.DataSource"
          password="*****"
          driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
          maxIdle="2"
          maxWait="5000"
          username="sa"
          url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Northwind"
          maxActive="20"/>
      </GlobalNamingResources>
      <Service
          name="Catalina">
        <Connector
            port="80"
            redirectPort="8443"
            minSpareThreads="25"
            connectionTimeout="20000"
            maxSpareThreads="75"
            maxThreads="150"
            maxHttpHeaderSize="8192">
        </Connector>
        <Connector
            port="8009"
            redirectPort="8443"
            protocol="AJP/1.3">
        </Connector>
        <Engine
            defaultHost="localhost"
            name="Catalina">
          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
          <Host
              appBase="webapps"
              name="localhost">
          </Host>
        </Engine>
      </Service>
    </Server>

    3.在conf下面的context.xml文件中,</Context>之前加入

     <ResourceLink name="jdbc/Northwind" global="jdbc/Northwind" type="javax.sql.DataSourcer"/>

    4.在你的web文件夾下面的WEB-INF中找到web.xml,在最后</web-app>之前加入

    <resource-ref>
          <description>Northwind Connection</description>
          <res-ref-name>jdbc/Northwind</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
        </resource-ref>

    5.保存,重啟tomcat,這樣,通過測試頁面,就可以發現已經可以通過數據庫連接池連上sql2k

    test1.jsp

    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
    <%@page import="javax.naming.*"%>
    <%@page import="javax.sql.*"%>
    <%
    Context initContext = new InitialContext();
    Context envContext  = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/Northwind");
    Connection conn = ds.getConnection();
    int counts=0;
    String sql="select count(*) from orders";
    PreparedStatement pst=conn.prepareStatement(sql);
    ResultSet rst=pst.executeQuery();
    while(rst.next()){
     counts=rst.getInt(1);
    }
    %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>JNDI 測試</title>
    </head>

    <body>
    <%=sql%><br>
    pnrreg talbe's count is:<%=counts%>
    </body>
    </html>

    posted @ 2008-06-06 12:04 JavaSuns 閱讀(303) | 評論 (0)編輯 收藏

    (轉)JS的正則表達式

         摘要: JS的正則表達式 //校驗是否全由數字組成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return false return true } //校驗登錄名:只能輸入5-20個以字母開頭、可帶數字、“_”...  閱讀全文

    posted @ 2008-04-25 12:44 JavaSuns 閱讀(415) | 評論 (0)編輯 收藏

    (轉)正則表達式之道

    原著:Steve Mansour
    sman@scruznet.com
    Revised: June 5, 1999
    (copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! )

    翻譯:Neo Lee
    neo.lee@gmail.com
    2004年10月16日

    英文版原文

    譯者按:原文因為年代久遠,文中很多鏈接早已過期(主要是關于vi、sed等工具的介紹和手冊),本譯文中已將此類鏈接刪除,如需檢查這些鏈接可以查看上面鏈接的原文。除此之外基本照原文直譯,括號中有“譯者按”的部分是譯者補充的說明。如有內容方面的問題請直接和Steve Mansor聯系,當然,如果你只寫中文,也可以和我聯系。

    目 錄

    什么是正則表達式
    范例
       簡單
       中級(神奇的咒語)
       困難(不可思議的象形文字)
    不同工具中的正則表達式

    什么是正則表達式

    一個正則表達式,就是用某種模式去匹配一類字符串的一個公式。很多人因為它們看上去比較古怪而且復雜所以不敢去使用——很不幸,這篇文章也不能夠改變這一點,不過,經過一點點練習之后我就開始覺得這些復雜的表達式其實寫起來還是相當簡單的,而且,一旦你弄懂它們,你就能把數小時辛苦而且易錯的文本處理工作壓縮在幾分鐘(甚至幾秒鐘)內完成。正則表達式被各種文本編輯軟件、類庫(例如Rogue Wave的tools.h++)、腳本工具(像awk/grep/sed)廣泛的支持,而且像Microsoft的Visual C++這種交互式IDE也開始支持它了。

    我們將在如下的章節中利用一些例子來解釋正則表達式的用法,絕大部分的例子是基于vi中的文本替換命令和grep文件搜索命令來書寫的,不過它們都是比較典型的例子,其中的概念可以在sed、awk、perl和其他支持正則表達式的編程語言中使用。你可以看看不同工具中的正則表達式這一節,其中有一些在別的工具中使用正則表達式的例子。還有一個關于vi中文本替換命令(s)的簡單說明附在文后供參考。

    正則表達式基礎

    正則表達式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫的字母和數字,而元字符則具有特殊的含義,我們下面會給予解釋。

    在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。

    要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了所有的元字符和對它們的一個簡短的描述。

    元字符   描述


    .
    匹配任何單個字符。例如正則表達式r.t匹配這些字符串:rat、rut、r t,但是不匹配root。 
    $
    匹配行結束符。例如正則表達式weasel$ 能夠匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。 
    ^
    匹配一行的開始。例如正則表達式^When in能夠匹配字符串"When in the course of human events"的開始,但是不能匹配"What and When in the"。
    *
    匹配0或多個正好在它之前的那個字符。例如正則表達式.*意味著能夠匹配任意數量的任何字符。
    \
    這是引用府,用來將這里列出的這些元字符當作普通的字符來進行匹配。例如正則表達式\$被用來匹配美元符號,而不是行尾,類似的,正則表達式\.用來匹配點字符,而不是任何字符的通配符。
    [ ] 
    [c1-c2]
    [^c1-c2]
    匹配括號中的任何一個字符。例如正則表達式r[aou]t匹配rat、rotrut,但是不匹配ret。可以在括號中使用連字符-來指定字符的區間,例如正則表達式[0-9]可以匹配任何數字字符;還可以制定多個區間,例如正則表達式[A-Za-z]可以匹配任何大小寫字母。另一個重要的用法是“排除”,要想匹配除了指定區間之外的字符——也就是所謂的補集——在左邊的括號和第一個字符之間使用^字符,例如正則表達式[^269A-Z] 將匹配除了2、6、9和所有大寫字母之外的任何字符。
    \< \>
    匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\<the能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。
    \( \)
    將 \( 和 \) 之間的表達式定義為“組”(group),并且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 \1\9 的符號來引用。
    |
    將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。
    +
    匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。
    ?
    匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。
    \{i\}
    \{i,j\}
    匹配指定數目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]\{3\} 能夠匹配字符"A"后面跟著正好3個數字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]\{4,6\} 匹配連續的任意4個、5個或者6個數字字符。注意:這個元字符不是所有的軟件都支持的。

     


    最簡單的元字符是點,它能夠匹配任何單個字符(注意包括新行符)。假定有個文件test.txt包含以下幾行內容:

      he is a rat
      he is in a rut
      the food is Rotten
      I like root beer
    我們可以使用grep命令來測試我們的正則表達式,grep命令使用正則表達式去嘗試匹配指定文件的每一行,并將至少有一處匹配表達式的所有行顯示出來。命令
      grep r.t test.txt
    在test.txt文件中的每一行中搜索正則表達式r.t,并打印輸出匹配的行。正則表達式r.t匹配一個r接著任何一個字符再接著一個t。所以它將匹配文件中的ratrut,而不能匹配Rotten中的Rot,因為正則表達式是大小寫敏感的。要想同時匹配大寫和小寫字母,應該使用字符區間元字符(方括號)。正則表達式[Rr]能夠同時匹配Rr。所以,要想匹配一個大寫或者小寫的r接著任何一個字符再接著一個t就要使用這個表達式:[Rr].t。

    要想匹配行首的字符要使用抑揚字符(^)——又是也被叫做插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,但是這會匹配第三行的the,所以要使用正則表達式^he,它只匹配在行首出現的h。

    有時候指定“除了×××都匹配”會比較容易達到目的,當抑揚字符(^)出現在方括號中是,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情性(也就是theshe),可以使用:[^st]he

    可以使用方括號來指定多個字符區間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接著0或者多個字母(大寫或者小寫)。當然我們也可以用元字符+做到同樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等價。但是要注意元字符+ 并不是所有支持正則表達式的程序都支持的。關于這一點可以參考后面的正則表達式語法支持情況。

    要指定特定數量的匹配,要使用大括號(注意必須使用反斜杠來轉義)。想匹配所有1001000的實例而排除1010000,可以使用:10\{2,3\},這個正則表達式匹配數字1后面跟著2或者3個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數字,例如正則表達式0\{3,\} 將匹配至少3個連續的0。

    簡單的例子

    這里有一些有代表性的、比較簡單的例子。

    vi 命令 作用


    :%s/ */ /g 把一個或者多個空格替換為一個空格。
    :%s/ *$// 去掉行尾的所有空格。
    :%s/^/ / 在每一行頭上加入一個空格。
    :%s/^[0-9][0-9]* // 去掉行首的所有數字字符。
    :%s/b[aeio]g/bug/g 將所有的bag、begbigbog改為bug。 
    :%s/t\([aou]\)g/h\1t/g 將所有tag、togtug分別改為hathothug(注意用group的用法和使用\1引用前面被匹配的字符)。

    中級的例子(神奇的咒語)

    例1

    將所有方法foo(a,b,c)的實例改為foo(b,a,c)。這里a、b和c可以是任何提供給方法foo()的參數。也就是說我們要實現這樣的轉換:

    之前   之后
    foo(10,7,2) foo(7,10,2)
    foo(x+13,y-2,10) foo(y-2,x+13,10)
    foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)

    下面這條替換命令能夠實現這一魔法:

      :%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g

    現在讓我們把它打散來加以分析。寫出這個表達式的基本思路是找出foo()和它的括號中的三個參數的位置。第一個參數是用這個表達式來識別的::\([^,]*\),我們可以從里向外來分析它: 

    [^,]   除了逗號之外的任何字符
    [^,]* 0或者多個非逗號字符
    \([^,]*\) 將這些非逗號字符標記為\1,這樣可以在之后的替換模式表達式中引用它
    \([^,]*\), 我們必須找到0或者多個非逗號字符后面跟著一個逗號,并且非逗號字符那部分要標記出來以備后用。

    現在正是指出一個使用正則表達式常見錯誤的最佳時機。為什么我們要使用[^,]*這樣的一個表達式,而不是更加簡單直接的寫法,例如:.*,來匹配第一個參數呢?設想我們使用模式.*來匹配字符串"10,7,2",它應該匹配"10,"還是"10,7,"?為了解決這個兩義性(ambiguity),正則表達式規定一律按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個參數而不是我們期望的一個。所以,我們要使用[^,]*來強制取出第一個逗號之前的部分。

    這個表達式我們已經分析到了:foo(\([^,]*\),這一段可以簡單的翻譯為“當你找到foo(就把其后直到第一個逗號之前的部分標記為\1”。然后我們使用同樣的辦法標記第二個參數為\2。對第三個參數的標記方法也是一樣,只是我們要搜索所有的字符直到右括號。我們并沒有必要去搜索第三個參數,因為我們不需要調整它的位置,但是這樣的模式能夠保證我們只去替換那些有三個參數的foo()方法調用,在foo()是一個重載(overoading)方法時這種明確的模式往往是比較保險的。然后,在替換部分,我們找到foo()的對應實例,然后利用標記好的部分進行替換,是的第一和第二個參數交換位置。

    例2

    假設有一個CSV(comma separated value)文件,里面有一些我們需要的信息,但是格式卻有問題,目前數據的列順序是:姓名,公司名,州名縮寫,郵政編碼,現在我們希望講這些數據重新組織,以便在我們的某個軟件中使用,需要的格式為:姓名,州名縮寫-郵政編碼,公司名。也就是說,我們要調整列順序,還要合并兩個列來構成一個新列。另外,我們的軟件不能接受逗號前后面有任何空格(包括空格和制表符)所以我們還必須要去掉逗號前后的所有空格。

    這里有幾行我們現在的數據:

      Bill Jones,     HI-TEK Corporation ,  CA, 95011
      Sharon Lee Smith,  Design Works Incorporated,  CA, 95012
      B. Amos   ,  Hill Street Cafe,  CA, 95013
      Alexander Weatherworth,  The Crafts Store,  CA, 95014
      ...
    我們希望把它變成這個樣子:
      Bill Jones,CA 95011,HI-TEK Corporation
      Sharon Lee Smith,CA 95012,Design Works Incorporated
      B. Amos,CA 95013,Hill Street Cafe
      Alexander Weatherworth,CA 95014,The Crafts Store
      ...
    我們將用兩個正則表達式來解決這個問題。第一個移動列和合并列,第二個用來去掉空格。

    下面就是第一個替換命令:

      :%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/
    這里的方法跟例1基本一樣,第一個列(姓名)用這個表達式來匹配:\([^,]*\),即第一個逗號之前的所有字符,而姓名內容被用\1標記下來。公司名和州名縮寫字段用同樣的方法標記為\2\3,而最后一個字段用\(.*\)來匹配("匹配所有字符直到行末")。替換部分則引用上面標記的那些內容來進行構造。

    下面這個替換命令則用來去除空格:

      :%s/[ \t]*,[ \t]*/,/g
    我們還是分解來看:[ \t]匹配空格/制表符,[ \t]* 匹配0或多個空格/制表符,[ \t]*,匹配0或多個空格/制表符后面再加一個逗號,最后,[ \t]*,[ \t]*匹配0或多個空格/制表符接著一個逗號再接著0或多個空格/制表符。在替換部分,我們簡單的我們找到的所有東西替換成一個逗號。這里我們使用了結尾的可選的g參數,這表示在每行中對所有匹配的串執行替換(而不是缺省的只替換第一個匹配串)。

    例3

    假設有一個多字符的片斷重復出現,例如:
    Billy tried really hard
    Sally tried really really hard
    Timmy tried really really really hard
    Johnny tried really really really really hard
    而你想把"really"、"really really",以及任意數量連續出現的"really"字符串換成一個簡單的"very"(simple is good!),那么以下命令:
    :%s/\(really \)\(really \)*/very /
    就會把上述的文本變成:
    Billy tried very hard
    Sally tried very hard
    Timmy tried very hard
    Johnny tried very hard
    表達式\(really \)*匹配0或多個連續的"really "(注意結尾有個空格),而\(really \)\(really \)* 匹配1個或多個連續的"really "實例。

    困難的例子(不可思議的象形文字)

    Coming soon.

     


    不同工具中的正則表達式

    OK,你已經準備使用RE(regular expressions,正則表達式),但是你并準備使用vi。所以,在這里我們給出一些在其他工具中使用RE的例子。另外,我還會總結一下你在不同程序之間使用RE可能發現的區別。

    當然,你也可以在Visual C++編輯器中使用RE。選擇Edit->Replace,然后選擇"Regular expression"選擇框,Find What輸入框對應上面介紹的vi命令:%s/pat1/pat2/g中的pat1部分,而Replace輸入框對應pat2部分。但是,為了得到vi的執行范圍和g選項,你要使用Replace All或者適當的手工Find Next and Replace(譯者按:知道為啥有人罵微軟弱智了吧,雖然VC中可以選中一個范圍的文本,然后在其中執行替換,但是總之不夠vi那么靈活和典雅)。

    sed

    Sed是Stream EDitor的縮寫,是Unix下常用的基于文件和管道的編輯工具,可以在手冊中得到關于sed的詳細信息。

    這里是一些有趣的sed腳本,假定我們正在處理一個叫做price.txt的文件。注意這些編輯并不會改變源文件,sed只是處理源文件的每一行并把結果顯示在標準輸出中(當然很容易使用重定向來定制):

    sed腳本   描述


    sed 's/^$/d' price.txt 刪除所有空行
    sed 's/^[ \t]*$/d' price.txt 刪除所有只包含空格或者制表符的行
    sed 's/"http://g' price.txt 刪除所有引號

    awk

    awk是一種編程語言,可以用來對文本數據進行復雜的分析和處理。可以在手冊中得到關于awk的詳細信息。這個古怪的名字是它作者們的姓的縮寫(Aho,Weinberger和Kernighan)。

    在Aho,Weinberger和Kernighan的書The AWK Programming Language中有很多很好的awk的例子,請不要讓下面這些微不足道的腳本例子限制你對awk強大能力的理解。我們同樣假定我們針對price.txt文件進行處理,跟sed一樣,awk也只是把結果顯示在終端上。 

    awk腳本   描述


    awk '$0 !~ /^$/' price.txt 刪除所有空行
    awk 'NF > 0' price.txt awk中一個更好的刪除所有行的辦法
    awk '$2 ~ /^[JT]/ {print $3}' price.txt 打印所有第二個字段是'J'或者'T'打頭的行中的第三個字段
    awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt 針對所有第二個字段不包含'Misc'或者'misc'的行,打印第3和第4列的和(假定為數字)
    awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt 打印所有第三個字段不是數字的行,這里數字是指d.d或者d這樣的形式,其中d是0到9的任何數字
    awk '$2 ~ /John|Fred/ {print $0}' price.txt 如果第二個字段包含'John'或者'Fred'則打印整行

    grep

    grep是一個用來在一個或者多個文件或者輸入流中使用RE進行查找的程序。它的name編程語言可以用來針對文件和管道進行處理??梢栽谑謨灾械玫疥P于grep的完整信息。這個同樣古怪的名字來源于vi的一個命令,g/re/p,意思是global regular expression print。

    下面的例子中我們假定在文件phone.txt中包含以下的文本,——其格式是姓加一個逗號,然后是名,然后是一個制表符,然后是電話號碼:

      Francis, John           5-3871
      Wong, Fred              4-4123
      Jones, Thomas           1-4122
      Salazar, Richard        5-2522

    grep命令   描述


    grep '\t5-...1' phone.txt 把所有電話號碼以5開頭以1結束的行打印出來,注意制表符是用\t表示的
    grep '^S[^ ]* R' phone.txt 打印所有姓以S打頭和名以R打頭的行
    grep '^[JW]' phone.txt 打印所有姓開頭是J或者W的行
    grep ', ....\t' phone.txt 打印所有姓是4個字符的行,注意制表符是用\t表示的
    grep -v '^[JW]' phone.txt 打印所有不以J或者W開頭的行
    grep '^[M-Z]' phone.txt 打印所有姓的開頭是M到Z之間任一字符的行
    grep '^[M-Z].*[12]' phone.txt 打印所有姓的開頭是M到Z之間任一字符,并且點號號碼結尾是1或者2的行

    egrep

    egrep是grep的一個擴展版本,它在它的正則表達式中支持更多的元字符。下面的例子中我們假定在文件phone.txt中包含以下的文本,——其格式是姓加一個逗號,然后是名,然后是一個制表符,然后是電話號碼:
      Francis, John           5-3871
      Wong, Fred              4-4123
      Jones, Thomas           1-4122
      Salazar, Richard        5-2522

    egrep command   Description


    egrep '(John|Fred)' phone.txt 打印所有包含名字John或者Fred的行
    egrep 'John|22$|^W' phone.txt 打印所有包含John 或者以22結束或者以W的行
    egrep 'net(work)?s' report.txt 從report.txt中找到所有包含networks或者nets的行


    正則表達式語法支持情況

    命令或環境 . [ ] ^ $ \( \) \{ \} ? + | ( )
    vi  X   X   X   X   X           
    Visual C++  X   X   X   X   X           
    awk  X   X   X   X       X   X   X   X 
    sed  X   X   X   X   X   X         
    Tcl  X   X   X   X   X     X   X   X   X 
    ex  X   X   X   X   X   X         
    grep  X   X   X   X   X   X         
    egrep  X   X  X   X   X     X   X   X   X 
    fgrep  X   X   X   X   X           
    perl  X  X  X  X  X    X  X  X  X

     


    vi替換命令簡介

    Vi的替換命令:
      :ranges/pat1/pat2/g
    其中
      : 這是Vi的命令執行界面。
      range 是命令執行范圍的指定,可以使用百分號(%)表示所有行,使用點(.)表示當前行,使用美元符號($)表示最后一行。你還可以使用行號,例如10,20表示第10到20行,.,$表示當前行到最后一行,.+2,$-5表示當前行后兩行直到全文的倒數第五行,等等。

      s 表示其后是一個替換命令。

      pat1 這是要查找的一個正則表達式,這篇文章中有一大堆例子。

      pat2 這是希望把匹配串變成的模式的正則表達式,這篇文章中有一大堆例子。

      g 可選標志,帶這個標志表示替換將針對行中每個匹配的串進行,否則則只替換行中第一個匹配串。

    網上有很多vi的在線手冊,你可以訪問他們以獲得更加完整的信息。

    posted @ 2008-04-25 09:18 JavaSuns 閱讀(341) | 評論 (0)編輯 收藏

    Eclipse插件下載大全 (轉)

    Eclipse下載
    EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在這里下載
    http://www.eclipse.org/downloads/index.php

    2  lomboz J2EE插件,開發JSP,EJB
    http://forge.objectweb.org/projects/lomboz

    3  MyEclipse J2EE開發插件,支持SERVLET/JSP/EJB/數據庫操縱等
    http://www.myeclipseide.com

    4  Properties Editor  編輯java的屬性文件,并可以自動存盤為Unicode格式
    http://propedit.sourceforge.jp/index_en.html

    5  Colorer Take  為上百種類型的文件按語法著色
    http://colorer.sourceforge.net/

    6  XMLBuddy 編輯xml文件
    http://www.xmlbuddy.com

    7  Code Folding  加入多種代碼折疊功能(比eclipse自帶的更多)
    http://www.coffee-bytes.com/servlet/PlatformSupport

    8  Easy Explorer  從eclipse中訪問選定文件、目錄所在的文件夾
    http://easystruts.sourceforge.net/

    9  Fat Jar 打包插件,可以方便的完成各種打包任務,可以包含外部的包等
    http://fjep.sourceforge.net/

    10  RegEx Test 測試正則表達式
    http://brosinski.com/stephan/archives/000028.php

    11  JasperAssistant 報表插件(要錢的哦~)
    http://www.jasperassistant.com/

    12  Jigloo GUI Builder JAVA的GUI編輯插件
    http://cloudgarden.com/jigloo/

    13  Profiler 性能跟蹤、測量工具,能跟蹤、測量B/S程序
    http://sourceforge.net/projects/eclipsecolorer/

    14  AdvanQas 提供對if/else等條件語句的提示和快捷幫助(自動更改結構等)
    http://eclipsecolorer.sourceforge.net/advanqas/index.html

    15  Log4E Log4j插件,提供各種和Log4j相關的任務,如為方法、類添加一個logger等
    http://log4e.jayefem.de/index.php/Main_Page

    16  VSSPlugin VSS插件
    http://sourceforge.net/projects/vssplugin

    17  Implementors 提供跳轉到一個方法的實現類,而不是接口的功能(實用!)
    http://eclipse-tools.sourceforge.net/implementors/

    18  Call Hierarchy 顯示一個方法的調用層次(被哪些方法調,調了哪些方法)
    http://eclipse-tools.sourceforge.net/call-hierarchy/index.html

    19  EclipseTidy 檢查和格式化HTML/XML文件
    http://eclipsetidy.sourceforge.net/

    20  Checkclipse 檢查代碼的風格、寫法是否符合規范
    http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm

    21  Hibernate Synchronizer Hibernate插件,自動映射等
    http://www.binamics.com/hibernatesync/

    22  VeloEclipse  Velocity插件
    http://propsorter.sourceforge.net/ 
     
    23  EditorList 方便的列出所有打開的Editor
    http://editorlist.sourceforge.net/ 
     
    24  MemoryManager 內存占用率的監視
    http://cloudgarden.com/memorymanager/ 
     
    25  swt-designer java的GUI插件
    http://www.swt-designer.com/
     
    26  TomcatPlugin 支持Tomcat插件
    http://www.sysdeo.com/eclipse/tomcatPlugin.html
     
    27  XML Viewer
    http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html
     
    28  quantum 數據庫插件
    http://quantum.sourceforge.net/
     
    29  Dbedit 數據庫插件
    http://sourceforge.net/projects/dbedit
     
    30  clay.core 可視化的數據庫插件
    http://www.azzurri.jp/en/software/index.jsp
    http://www.azzurri.jp/eclipse/plugins
     
    31  hiberclipse hibernate插件
    http://hiberclipse.sourceforge.net
    http://www.binamics.com/hibernatesync
     
    32  struts-console Struts插件
    http://www.jamesholmes.com/struts/console/
     
    33  easystruts Struts插件
    http://easystruts.sourceforge.net 
     
    34  veloedit Velocity插件
    http://veloedit.sourceforge.net/
     
    35  jalopy 代碼整理插件
    http://jalopy.sourceforge.net/
     
    36  JDepend 包關系分析
    http://andrei.gmxhome.de/jdepend4eclipse/links.html
     
    37  Spring IDE Spring插件
    http://springide-eclip.sourceforge.net/updatesite/
     
    38  doclipse 可以產生xdoclet 的代碼提示
    http://beust.com/doclipse/

    39  SQLExplorer,在Eclipse 中連接各種數據庫進行操作使用
    http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124

    JSEclipse

    插件介紹:JSEclipse是個Eclipse下的免費Javascript腳本編輯器

    subversion
    版本控制,相當于CVS
    安裝:http://subclipse.tigris.org/install.html
    Name: Subclipse
    URL:  http://subclipse.tigris.org/update_1.0.x


    CSS Editor for Eclipse
    http://csseditor.sourceforge.net/

    FacesIDE
    FacesIDE是一個用于開發JSF的Eclispe插件.它可以可視化編輯faces-config.xml文件并且提供代碼編輯與校驗,預覽JSF的JSP文件.FacesIDE包含MyFaces來作為JSF的實現
    http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=FacesIDE

    Eclipse SQLExplorer plugin
    一個數據庫管理插件
    http://sourceforge.net/projects/eclipsesql

    Poperties Editor
    一個在編輯完成后可以將資源文件中的中文編碼格式轉換為unicode編碼的插件,在開發國際化應用程序的時候非常有用
    http://propedit.sourceforge.jp/eclipse/updates/

    eclipseME
     
    http://eclipseme.org/updates/

    Eclipse加速插件KeepResident
    http://suif.stanford.edu/pub/keepresident/

     
    MyEclipse  J2EE開發插件,支持SERVLET/JSP/EJB/數據庫操縱等
    www.myeclipseide.com
     
    Properties Editor  編輯java的屬性文件,并可以自動存盤為Unicode格式
    http://propedit.sourceforge.jp/index_en.html
    http://propedit.sourceforge.jp/eclipse/updates/
     
    Colorer Take  為上百種類型的文件按語法著色
    http://colorer.sourceforge.net/
     
    XMLBuddy 編輯xml文件
    www.xmlbuddy.com
     
    Code Folding  加入多種代碼折疊功能(比eclipse自帶的更多)
    http://www.coffee-bytes.com/servlet/PlatformSupport
     
    Easy Explorer  從eclipse中訪問選定文件、目錄所在的文件夾
    http://easystruts.sourceforge.net/
     
    Fat Jar 打包插件,可以方便的完成各種打包任務,可以包含外部的包等
    http://fjep.sourceforge.net/
     
    RegEx Test 測試正則表達式
    http://brosinski.com/stephan/archives/000028.php
     
    JasperAssistant 報表插件(強,要錢的)
    http://www.jasperassistant.com/
     
    Jigloo GUI Builder JAVA的GUI編輯插件
    http://cloudgarden.com/jigloo/
     
    Profiler 性能跟蹤、測量工具,能跟蹤、測量BS程序
    http://sourceforge.net/projects/eclipsecolorer/
     
    AdvanQas 提供對if/else等條件語句的提示和快捷幫助(自動更改結構等)
    http://eclipsecolorer.sourceforge.net/advanqas/index.html
     
    Log4E     Log4j插件,提供各種和Log4j相關的任務,如為方法、類添加一個logger等
    http://log4e.jayefem.de/index.php/Main_Page
     
    VSSPlugin VSS插件
    http://sourceforge.net/projects/vssplugin
     
    Implementors   提供跳轉到一個方法的實現類,而不是接中的功能(實用!)
    http://eclipse-tools.sourceforge.net/implementors/
     
    Call Hierarchy 顯示一個方法的調用層次(被哪些方法調,調了哪些方法)
    http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
     
    EclipseTidy 檢查和格式化HTML/XML文件
    http://eclipsetidy.sourceforge.net/
     
    Checkclipse 檢查代碼的風格、寫法是否符合規范
    http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
     
    Hibernate Synchronizer Hibernate插件,自動映射等
    http://www.binamics.com/hibernatesync/
     
    spring updatesite 插件
    http://springide.org/updatesite/

    VeloEclipse  Velocity插件
    http://propsorter.sourceforge.net/
     
    EditorList   方便的列出所有打開的Editor
    http://editorlist.sourceforge.net/
     
    MemoryManager 內存占用率的監視
    http://cloudgarden.com/memorymanager/

    Eclipse的游戲插件
    http://eclipse-games.sourceforge.net/

    JBoss-IDE
    http://jboss.sourceforge.net/jbosside/updates/

    自動反編譯class,安裝后要設定class文件缺省關聯到jode
    http://www.technoetic.com/eclipse/update


    jigloo swing/sw設計工具,里面自帶的form/anchor布局很好用!
    http://cloudgarden.soft-gems.net/update-site/

    jinto的資源文件編輯工具,同時編輯多種語言,而且自動轉換成iso8859-1編碼。很好用!
    http://www.guh-software.de/eclipse/  

    posted @ 2008-04-12 20:36 JavaSuns 閱讀(1383) | 評論 (0)編輯 收藏

    SQLSERVER字符串截取

    已知: 字段A='F:\photo\Winter Leaves.jpg'   
    要求:分段截取每段字符[字段A不能為TEXT類型,否則報錯]
    解決方法:
    +++++++++++++++++++++++++++++++++++++++++++++++++++


    ---截取字符串A的第一個\左邊的字符串
    select left(A,charindex('/',A)-1)
    輸出結果:F:
    ++++++++++++++++++++++++++++++++++++++++++++++++++++

    ---截取\中間的字符串
    select   left(stuff(A,1,charindex('/',A),''),charindex('/',stuff(A,1,charindex('/',A),''))-1)
    輸出結果:photo
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    ---截取最后一個\后面的字符串
    select   reverse(left(reverse(A),charindex('/',reverse(A))-1))
    輸出結果:Winter Leaves.jpg
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    ---截取字符串A的首字幕
    select   STUFF(A,1, 1, '')
    輸出結果::\photo\Winter Leaves.jpg
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    posted @ 2007-09-16 14:07 JavaSuns 閱讀(3915) | 評論 (3)編輯 收藏

    CSS光標(cursor)屬性一覽表

    把你的光標放到相應文字上查看效果

    要注意光標的實際效果依賴于用戶的系統設置,與你在這里看到的效果并不一定一致。

    cursor: crosshair;

    點擊查看圖片

    十字準心

    The cursor render as a crosshair
    游標表現為十字準線

    cursor: pointer;
    cursor: hand;
    寫兩個是為了照顧IE5,它只認hand。

    點擊查看圖片

    The cursor render as a pointer (a hand) that indicates a link
    游標以暗示(手指)的形式來表明有一個連接

    cursor: wait;

    點擊查看圖片

    等待/沙漏

    The cursor indicates that the program is busy (often a watch or an hourglass)
    游標暗示當前程序正忙(一般為一塊表或是一個沙漏)

    cursor: help;

    點擊查看圖片

    幫助

    The cursor indicates that help is available (often a question mark or a balloon)
    游標暗示當前位置可得到幫助(一般為問號或是氣球)

    cursor: no-drop;

    點擊查看圖片

    無法釋放

    cursor: no-drop;

    cursor: text;

    點擊查看圖片

    文字/編輯

    The cursor indicates text
    游標暗示當前所處位置為文字內容

    cursor: move;

    點擊查看圖片

    可移動對象

    The cursor indicates something that should be moved
    游標暗示一些東西應該被移動

    cursor: n-resize;

    向上改變大小(North)

    The cursor indicates that an edge of a box is to be moved up (north)
    邊緣可向上移動(北)

    cursor: s-resize;

    點擊查看圖片

    向下改變大小(South)

    The cursor indicates that an edge of a box is to be moved down (south)
    邊緣可向下方移動(南)

    cursor: e-resize;

    點擊查看圖片

    向右改變大小(East)

    The cursor indicates that an edge of a box is to be moved right (east)
    box邊緣可向右(東)邊移動

    cursor: w-resize;

    點擊查看圖片

    向左改變大小(West)

    The cursor indicates that an edge of a box is to be moved left (west)
    邊緣可向左移動(西)

    cursor: ne-resize;

    點擊查看圖片

    向上右改變大小(North East)

    The cursor indicates that an edge of a box is to be moved up and right (north/east)
    游標暗示box的邊緣可向右上方移動(東北方向)

    cursor: nw-resize;

    點擊查看圖片

    向上左改變大小(North West)

    The cursor indicates that an edge of a box is to be moved up and left (north/west)
    邊緣可向左上方移動(西北)

    cursor: se-resize;

    點擊查看圖片

    向下右改變大小(South East)

    The cursor indicates that an edge of a box is to be moved down and right (south/east)
    邊緣可向右下方移動(東南)

    cursor: sw-resize;

    點擊查看圖片

    向下左改變大小(South West)

    The cursor indicates that an edge of a box is to be moved down and left (south/west)
    邊緣可向左下方移動(西南)

    cursor: auto;

    自動

    The browser sets a cursor
    瀏覽器設置一個游標

    cursor:not-allowed;

    點擊查看圖片

    禁止

    cursor:not-allowed;

    cursor: progress;

    點擊查看圖片

    處理中

    cursor: progress;

    cursor: default;

    點擊查看圖片

    系統默認

    The default cursor (often an arrow)
    默認的游標狀態(通常為一個箭頭)

    cursor: url(' # ');
    # = 光標文件地址     (注意文件格式必須為:.cur 或 .ani)。

    點擊查看圖片

    用戶自定義(可用動畫)

    The url of a custom cursor to be used.
    自定義游標的url位置

    Note: Always define a generic cursor at the end of the list in case none of the url-defined cursors can be used
    注意:在定義完自定義的游標之后在末尾加上一般性的游標,以防那些url所定義的游標不能使用

    posted @ 2007-09-14 11:54 JavaSuns 閱讀(1997) | 評論 (0)編輯 收藏

    方便的工具

    Logo生成網站:

     

    天空秘書網,J/m!h._HK&Rq
    強烈推薦:http://www.logomaker.cn

     

    http://phorum.com.tw/Generator.aspx 天空秘書網,VK2V#J&t#W`*A
    http://www.logoyes.com/lc_leftframe.htm 天空秘書網&jD-L|;X+O8c
    http://cooltext.com/Default.aspx

     

    Banner圖片制作網站:

     

    http://www.bannerbreak.com/index.php

     

    在線圖片生成網站:

     

    http://www.streetsigngenerator.com/
    %u` U l5e&Bt;Fd0http://www.letterjames.de/

     

    圖片分割器: http://www.html-kit.com/e/is.cgi

     

    立體圖片生成器: http://www.chami.com/html-kit/services/imge/

     

    圖片生成郵票: http://photo.stamps.com/PhotoStamps/?source=si00001331

     

    個性拼圖: http://www.jigcool.com/jigonline/jigonline1_sc.php

     

    印章制作: http://caishu.sina.com.cn/

     

     

    GIF圖片的文字LOGO在線生成:http://www.3dtextmaker.com/cgi-bin/3dtext.pl

     

    在線制作logo,bannar的網站:http://www.crazystudy.com

     

    SAINT.Assess the Security of Computer Networks :http://www.saintcorporation.com/saint/

     

    Abacus.Intrusion Prevention System :http://www.psionic.com/abacus/

     

    Firewall Generator(在線生成簡單的防火墻腳本)

     

    http://www.citadec.com/FirewallGenerator.html

     

     

    在線字體圖片生成:http://www.youmade.com/font/

     

    在線生成條碼打印

     

    http://www.027hc.com/y1.asp
    [tG+|$M{~/@"dV0http://www.nlscan.com/soucecentre/demo.asp
    #U|TA I%F Ts0http://www.gzbonny.com/asp/barcode.asp

     

    在線圖形特效生成:http://www.chami.com/

     

    聊天工具在線狀態生成器:http://www.onlinestatus.org/forum/usage.php

     

    粉絲身份證:http://id.igogo8.com/

     

    制作印章:http://www.makepic.com/print.php

     

    郵址圖片生成:http://www.makepic.com/email.php

     

    條形碼生成:http://www.makepic.com/barcode.php

     

    Kiss學堂 頒發結業證:http://www.makepic.com/kiss/cert.php

     

    生成頭像:http://www.eoool.com/ImageDIY/DIYChooseImg.aspx?ImgSize=96x96x1

     

    郵件:http://www.eoool.com/Sevice.aspx?TypeID=1

     

    聊天圖標:http://www.eoool.com/Sevice.aspx?TypeID=2

     

    博客圖標:http://www.eoool.com/Sevice.aspx?TypeID=3

     

    網絡書簽:http://www.eoool.com/Sevice.aspx?TypeID=5

     

    朋友圈:http://www.eoool.com/Sevice.aspx?TypeID=4

     

    按扭:http://www.eoool.com/Sevice.aspx?TypeID=11

     

    生成拼湊圖:http://blog.outer-court.com/letters/

     

    一個日本武士刀劈出你需要的字:

     

    http://tools.fodey.com/generators/animated/ninjatext.asp

     

    生成幾種卡通人物對話動態圖片:

     

    http://tools.fodey.com/generators/animated/talking_squirrel.asp天空秘書網P R_9]H,|,x

    ^0g3pI#}5l;z.v`F0香煙盒生成,可以做警告圖片:http://tools.fodey.com/generators/cigarette_packet/generator.cig

     

    支持多種域名的Email圖標的生成: http://www.nhacks.com/email/

     

    兩個地址支持兩種風格任意文本的Email圖標的生成:

     

    http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html天空秘書網Q T2z6^9~ \8kZ g'IW
    http://sagittarius.dip.jp/~toshi/cgi-bin/catmark/catmark.html

     

    在線favicon生成器: http://www.html-kit.com/e/favicon.cgi

     

    支持各種類型圖片的生成,可以選擇設置的條件非常靈活:

     

    http://www.abi-station.com/tchinese/

     

    支持大量中文字體簽名圖標生成: http://www.youmade.com/font/

     

    Flickr雜志封面生成器: http://flagrantdisregard.com/flickr/magazine.php

     

    動態生成有趣圖片:

     

    愛因斯坦:http://www.hetemeel.com/einsteinform.php

     

    山姆大叔:http://www.hetemeel.com/unclesamform.php

     

    辭典:http://www.hetemeel.com/dictionaryform.php

     

    魔法師:http://www.imagegenerator.net/create/dumbledore/

     

    Flickr Logo風格圖片生成器::http://flickr.nosv.org/

     

    按鈕生成網站:

     

    http://kalsey.com/tools/buttonmaker/
    %u"l*FdqLp X8K9A6Z]0http://www.lucazappa.com/brilliantMaker/buttonImage.php天空秘書網A,W!s)[c{
    http://www.feedforall.com/public/rss-graphic-tool.htm天空秘書網L|e"j*BP8kS0A
    http://www.kalsey.com/tools/buttonmaker/
    y$A Si1Y&N/Z0http://www.yugatech.com/make.php天空秘書網R SS2_ E^9[.O
    http://www.hkwebs.net/catalog/tools/buttonmaker/index.php

     

    Email圖標生成網站::

     

    http://email.playtime.uni.cc/
    :y]~5d'[d3L Y+k$j0http://services.nexodyne.com/email/
    6nPlesL0http://gizmo967.mgs3.org/Gmail/
    R-GD kl3[z0http://www.hkwebs.net/catalog/tools/gmail/ 天空秘書網;N5ha5a*V`P3`
    http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html
    ~z'Z'GK%h4cq0http://www.eoool.com/

    posted @ 2007-08-29 11:28 JavaSuns 閱讀(511) | 評論 (0)編輯 收藏

    一些有用的正則表達式

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

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

    應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

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

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

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

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

    應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:

    String.prototype.trim = function()
    {
    return this.replace(/(^\s*)|(\s*$)/g, "");
    }

    利用正則表達式分解和轉換IP地址:

    下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:

    function IP2V(ip)
    {
    re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達式
    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!")
    }
    }

    不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:

    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地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

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

    利用正則表達式去除字串中重復的字符的算法程序:

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

    我原來在CSDN上發貼尋求一個表達式來實現去除重復字符的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用后向引用取出包括重復的字符,再以重復的字符建立第二個表達式,取到不重復的字符,兩者串連。這個方法對于字符順序有要求的字符串可能不適用。

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

    s="http://www.gzcynet/page1.htm"
    s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
    alert(s)

    利用正則表達式限制網頁表單里的文本框輸入內容:

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

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

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

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


    下面四個都是檢查email的...

    ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$

    ^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$

    ^.+@[^\.].*\.[a-z]{2,}$

    ^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$

    posted @ 2007-08-22 15:39 JavaSuns 閱讀(451) | 評論 (0)編輯 收藏

    模型驅動架構 (MDA)[分享]

    模型驅動架構(MDA)是一種獨立于特定平臺和軟件供應商的軟件體系結構設計和開發方法,它適用于設計、部署、集成等軟件開發的整個生命周期。MDA 遵循的是諸如統一建模語言(UML)、可擴展標記語言(XML)和公共對象請求代理體系結構(CORBA)等一系列業界開放標準。

      MDA 建模是基于功能,而非基于特定語言、平臺或實現技術,它可以簡化系統集成、縮短開發周期和節省企業資源。

      模型通常以圖和文字的形式來描述一個系統及其環境。模型驅動的方法就是利用模型來引導系統的設計、開發和維護。而模型驅動架構即是用系統的模型來生成系統的體系結構。

      MDA 有三個視圖。第一個視圖叫“計算無關視圖(CIV)”,其作用就是將系統基本處理邏輯同平臺相關的技術規范分離開來。CIV視圖關注于系統的環境和需求,而系統的具體結構和實現是隱藏的。

      第二個視圖是“平臺無關視圖(PIV)”。該視圖關注于系統的操作而隱藏了平臺相關的細節,該視圖可能用一種通用的、平臺無關的建模語言如UML來描述。

      第三個視圖叫“平臺相關視圖(PSV)”。該視圖關注特定平臺的實現細節。

      以上三個視圖都有其各自相應的模型:

    • 計算無關模型(CIM)通常由業務分析人員創建,展示了系統的業務模型。
    • 平臺無關模型(PIM)是系統功能的模型,通常由系統架構師創建。
    • 平臺相關模型(PSM)對一個或多個平臺的PIM模型的具體實現建模。

      MDA 的真正價值在于 CIM 模型可以通過簡單的映射轉換成 PIM 模型。同樣的,PIM 模型也可以映射成 PSM 模型,而 PSM 模型則可以最終轉換成具體的實現代碼。

      如下圖所示,右上角的 CIM 模型是整個模型轉換過程的起點。CIM 模型轉換成 PIM 模型后,系統架構師和設計師即可以創建系統其余部分的模型。設計完成之后,PIM 模型就轉換成了一個或多個 PSM 模型。

    模型驅動架構 (MDA)

    模型驅動架構 (MDA)

      MDA 提供了一種優雅而可靠的開發框架,這種框架使得系統架構師在沒有考慮到有關系統實現的任何細節之前就可以事先定義好系統的模型。

      MDA 的優勢主要包括如下幾點:

    • 可移植性 -當你創建好一個 PIM 模型之后,創建一個新的基于該 PIM 模型的 PSM 模型是相當容易的。當然,你需要到目標平臺的映射規則和一些連接代碼。
    • 跨平臺的互操作性 - 除了可以將一個系統模型轉化為不同的實現,你也可以使用一種特殊的映射規則將一個 PIM 模型轉化為一個異構的 PSM 模型,在該異構模型中,最終的系統是由來自多個平臺的組件構建而成的。
    • 開發效率 - MDA 是一種極其高效的設計和開發方法。使用 MDA 方法可以以更少的人力來完成原先相同的工作量,或者以原先相同的人力來完成更多的工作,所有這些都無需對開發團隊施加額外的壓力。
    • 軟件質量 - 使用一種單一的模型來生成和導出系統的大部分代碼可以極大地降低人為錯誤的發生。

      MDA 還有其它更多的優勢,如對新技術的快速包容、平臺無關性、領域相關性、降低開發成本和縮短開發周期等等。

    posted @ 2007-05-14 08:24 JavaSuns 閱讀(1579) | 評論 (1)編輯 收藏

    僅列出標題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: 国产午夜精品久久久久免费视| 亚洲国产婷婷六月丁香| 男人都懂www深夜免费网站| 日韩欧美亚洲国产精品字幕久久久| 亚洲伊人tv综合网色| 2048亚洲精品国产| 精品久久久久久久免费加勒比| 最近中文字幕无免费| a毛片免费全部在线播放**| 美女被爆羞羞网站免费| 亚洲爆乳无码专区www| 亚洲天堂男人影院| 亚洲视频一区在线| 久久青青草原亚洲AV无码麻豆| 国产gv天堂亚洲国产gv刚刚碰 | 亚洲成在人线av| 亚洲伊人成无码综合网 | 亚洲欧洲精品久久| 亚洲成AV人片在线观看无码| 久久99亚洲综合精品首页| 国产成人高清精品免费软件| 成年女人男人免费视频播放| 国产免费看JIZZ视频| 91精品免费在线观看| 免费在线观看视频网站| 57pao一国产成永久免费 | 亚洲视频免费在线观看| 国产亚洲日韩在线三区| 国产性爱在线观看亚洲黄色一级片 | 国产最新凸凹视频免费| 日本人的色道www免费一区| 成年人免费视频观看| 四虎影院在线免费播放| 妞干网免费观看视频| 四虎成人免费大片在线| 国产不卡免费视频| 亚洲成人一区二区| 国产亚洲精品看片在线观看| 亚洲人成亚洲人成在线观看| 亚洲AV无码成人精品区天堂| 久久久久亚洲AV无码麻豆|