六十路在线观看,亚洲精品中文字幕有码专区,日韩亚洲视频http://www.aygfsteel.com/coderdream/category/29710.html軟件工程師成長(zhǎng)之路zh-cnThu, 26 Aug 2010 17:29:17 GMTThu, 26 Aug 2010 17:29:17 GMT60【視頻筆記】Java反射機(jī)制筆記http://www.aygfsteel.com/coderdream/archive/2010/08/25/329888.htmlCoderDreamCoderDreamWed, 25 Aug 2010 08:12:00 GMThttp://www.aygfsteel.com/coderdream/archive/2010/08/25/329888.htmlhttp://www.aygfsteel.com/coderdream/comments/329888.htmlhttp://www.aygfsteel.com/coderdream/archive/2010/08/25/329888.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/329888.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/329888.html閱讀全文

CoderDream 2010-08-25 16:12 發(fā)表評(píng)論
]]>
非常不錯(cuò)的Flash報(bào)表工具-FusionChartshttp://www.aygfsteel.com/coderdream/archive/2010/02/03/311779.htmlCoderDreamCoderDreamWed, 03 Feb 2010 03:16:00 GMThttp://www.aygfsteel.com/coderdream/archive/2010/02/03/311779.htmlhttp://www.aygfsteel.com/coderdream/comments/311779.htmlhttp://www.aygfsteel.com/coderdream/archive/2010/02/03/311779.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/311779.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/311779.html
這里介紹一個(gè)Flash的表格生成工具--FusionCharts,它是一個(gè)收費(fèi)軟件,不過如果不是用于商業(yè)用途,只是用于,可以到網(wǎng)上下載破解版,csdn上面就有,如果想商業(yè),購(gòu)買應(yīng)該也不貴。

下面我們來看一個(gè)最簡(jiǎn)單的例子:
這個(gè)軟件生成表格的模式是:數(shù)據(jù)(XML文件或文件流)+模板。

1、XML數(shù)據(jù):
<chart caption='Monthly Sales Summary' subcaption='For the year 2006' xAxisName='Month' yAxisName='Sales' numberPrefix='$'>
    
<set label='January' value='17400' />
    
<set label='February' value='19800' />
    
<set label='March' value='21800' />
    
<set label='April' value='23800' />
    
<set label='May' value='29600' />
    
<set label='June' value='27600' />
    
<set label='July' value='31800' />
    
<set label='August' value='39700' />
    
<set label='September' value='37800' />
    
<set label='October' value='21900' />
    
<set label='November' value='32900' />
    
<set label='December' value='39800' />
</chart>

2、將所有需要用到的模板拷貝到固定的位置。

3、在html中指定數(shù)據(jù)位置和模板名稱:
<html>
   
<head>
      
<title>My First FusionCharts</title>
   
</head>
   
<body bgcolor="#ffffff">
      
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="900" height="300" id="Column3D" >
         
<param name="movie" value="../FusionCharts/Column3D.swf" />
         
<param name="FlashVars" value="&dataURL=Data.xml">
         
<param name="quality" value="high" />
         
<embed src="../FusionCharts/Column3D.swf" flashVars="&dataURL=Data.xml" quality="high" width="900" height="300" name="Column3D" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
      
</object>
</body>
</html>

4、運(yùn)行結(jié)果:




CoderDream 2010-02-03 11:16 發(fā)表評(píng)論
]]>
Oracle數(shù)據(jù)庫(kù)安裝及配置http://www.aygfsteel.com/coderdream/archive/2009/10/18/298760.htmlCoderDreamCoderDreamSun, 18 Oct 2009 12:13:00 GMThttp://www.aygfsteel.com/coderdream/archive/2009/10/18/298760.htmlhttp://www.aygfsteel.com/coderdream/comments/298760.htmlhttp://www.aygfsteel.com/coderdream/archive/2009/10/18/298760.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/298760.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/298760.html

1、安裝

Oracle 版本:Oracle Database 10g Release 2 (10.2.0.1)

下載地址:

http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html

安裝設(shè)置:

1)這里的全局?jǐn)?shù)據(jù)庫(kù)名即為你創(chuàng)建的數(shù)據(jù)庫(kù)名,以后在訪問數(shù)據(jù),創(chuàng)建“本地Net服務(wù)名”時(shí)用到;

2)數(shù)據(jù)庫(kù)口令在登錄和創(chuàng)建“本地Net服務(wù)名”等地方會(huì)用到。


2、創(chuàng)建“本地Net服務(wù)名”

1)通過【程序】-》【Oracle - OraDb10g_home1】-》【配置和移植工具】-》【Net Configuration Assistant】,運(yùn)行“網(wǎng)絡(luò)配置助手”工具:


2)選擇“本地 Net 服務(wù)名配置”:



3)這里的“Net 服務(wù)名”我們輸入安裝數(shù)據(jù)庫(kù)時(shí)的“全局?jǐn)?shù)據(jù)庫(kù)名”:



4)主機(jī)名我們輸入本機(jī)的IP地址:



5)測(cè)試數(shù)據(jù)庫(kù)連接,用戶名/密碼為:System/數(shù)據(jù)庫(kù)口令(安裝時(shí)輸入的“數(shù)據(jù)庫(kù)口令”):

 

默認(rèn)的用戶名/密碼錯(cuò)誤:



更改登錄,輸入正確的用戶名/密碼:



測(cè)試成功:


3、PLSQL Developer 連接測(cè)試

輸入正確的用戶名/口令:



成功登陸:

 

4、創(chuàng)建表空間

打開sqlplus工具:

sqlplus  /nolog

 連接數(shù)據(jù)庫(kù):

conn /as sysdba

 創(chuàng)建表空間:

create tablespace camds datafile 'D:\oracle\product\10.2.0\oradata\camds\camds.dbf' size 200m autoextend on next 10m maxsize unlimited;

5、創(chuàng)建新用戶

運(yùn)行“P/L SQL Developer”工具,以DBA(用戶名:System)的身份登錄:

1)新建“User(用戶):


2)設(shè)置用戶名、口令、默認(rèn)表空間(使用上面新建的表空間)和臨時(shí)表空間:


3)設(shè)置角色權(quán)限:



4)設(shè)置”系統(tǒng)權(quán)限“:



5)點(diǎn)擊應(yīng)用后,【應(yīng)用】按鈕變灰,新用戶創(chuàng)建成功:



6)新用戶登錄測(cè)試:

輸入新用戶的“用戶名/口令”:


新用戶“testcamds”成功登陸:


6、導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)

先運(yùn)行cmd命令,進(jìn)入命令行模式,轉(zhuǎn)到下面的目錄:D:"oracle"product"10.2.0"db_1"BIN【該目錄下有exp.exe文件】

1)導(dǎo)入

命令語(yǔ)法:

imp userid / pwd @sid   file = path / file  fromuser = testcamds touser = userid 

命令實(shí)例:

 imp testcamds / 123 @camds   file = c:"testcamds fromuser = testcamds touser = testcamds 

導(dǎo)入結(jié)果:



2)導(dǎo)出:

命令語(yǔ)法:

exp  userid / pwd @sid   file = path / file  owner = userid  

命令實(shí)例:

exp  testcamds / 123 @camdsora   file = c:"testcamds owner = testcamds 

 導(dǎo)入結(jié)果:

 



CoderDream 2009-10-18 20:13 發(fā)表評(píng)論
]]>
使用代理,下載MyEclipse blue 7.1 http://www.aygfsteel.com/coderdream/archive/2009/03/16/260103.htmlCoderDreamCoderDreamMon, 16 Mar 2009 14:04:00 GMThttp://www.aygfsteel.com/coderdream/archive/2009/03/16/260103.htmlhttp://www.aygfsteel.com/coderdream/comments/260103.htmlhttp://www.aygfsteel.com/coderdream/archive/2009/03/16/260103.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/260103.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/260103.html   本版本的最引人注目之處莫過于對(duì)WSAD5.1、RAD 6.X和7.X項(xiàng)目的加強(qiáng)支持,  包括促進(jìn)WSAD/RAD用戶在MyEclipse Blue 和RAD環(huán)境下提高項(xiàng)目質(zhì)量, . 全面有效執(zhí)行任務(wù)的特性。此外,那些希望能將自己的項(xiàng)目完全移植到  MyEclipse Blue 版本的朋友們,可以通過使用MyEclipse Blue 7.1中的簡(jiǎn)單向?qū)韺?shí)現(xiàn)了。 同時(shí),新項(xiàng)目也能夠完全支持已有的開發(fā)和服務(wù)器工具。 

 

下載地址為:

A:普通版:

http://downloads.myeclipseide.com/downloads/products/eworkbench/7.0/myeclipse-7.1-win32.exe

B:Blue版

http://downloads4.myeclipseide.com/downloads/products/eworkbench/7.0-Blue/myeclipse-blue-7.1-win32.exe

 

其中普通版可以直接用迅雷下載,但是blue卻連不上。

 

嘗試了多種方式,終于找到了下載方法,不過速度很慢,而且很不穩(wěn)定:

使用的軟件

1、OperaTor-2.5

這是一個(gè)附帶代理的瀏覽器軟件;

2、eMule V1.1.3

常用的電驢軟件;

 

下面我們來看看如何下載:

【步驟1】:打開OperaTor,程序打開后,會(huì)發(fā)現(xiàn)托盤區(qū)有一個(gè)藍(lán)色圖標(biāo),上面有一個(gè)字母“P";

【步驟2】:將鼠標(biāo)移到該圖標(biāo),點(diǎn)擊右鍵,依次選擇【Edit】-》【Main configuration】


【步驟3】:在打開的config.txt文件中,我們可以看到,本地代理的端口為:9050,


【步驟4】:設(shè)置電驢的代理服務(wù)器,這里的服務(wù)器類型選”Socks 4a“:


【步驟5】:最后,點(diǎn)擊電驢的”新建“按鈕,將”blue版“的地址拷貝過來就可以下載了:


不過通過代理方式下載的速度很慢,有時(shí)候還會(huì)斷線,這時(shí)候只需要重新打開上面軟件就可以了。



CoderDream 2009-03-16 22:04 發(fā)表評(píng)論
]]>
Dom4j 實(shí)踐http://www.aygfsteel.com/coderdream/archive/2008/08/20/223259.htmlCoderDreamCoderDreamWed, 20 Aug 2008 07:14:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/08/20/223259.htmlhttp://www.aygfsteel.com/coderdream/comments/223259.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/08/20/223259.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/223259.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/223259.html閱讀全文

CoderDream 2008-08-20 15:14 發(fā)表評(píng)論
]]>
Comparator 和 Comparable 應(yīng)用http://www.aygfsteel.com/coderdream/archive/2008/08/20/223200.htmlCoderDreamCoderDreamWed, 20 Aug 2008 03:37:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/08/20/223200.htmlhttp://www.aygfsteel.com/coderdream/comments/223200.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/08/20/223200.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/223200.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/223200.html

一、Comparator

強(qiáng)行對(duì)某個(gè)對(duì)象collection進(jìn)行整體排序的比較函數(shù),可以將Comparator傳遞給Collections.sort或Arrays.sort。

接口方法:

  /**
   * 
@return o1小于、等于或大于o2,分別返回負(fù)整數(shù)、零或正整數(shù)。
   
*/
  
int compare(Object o1, Object o2);


二、Comparable

強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序,實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過Collections.sort或Arrays.sort進(jìn)行自動(dòng)排序。

接口方法:

  /**
   * 
@return 該對(duì)象小于、等于或大于指定對(duì)象o,分別返回負(fù)整數(shù)、零或正整數(shù)。 
   
*/
  
int compareTo(Object o);

三、Comparator和Comparable的區(qū)別
一個(gè)類實(shí)現(xiàn)了Camparable接口則表明這個(gè)類的對(duì)象之間是可以相互比較的,這個(gè)類對(duì)象組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種算法的實(shí)現(xiàn),將算法和數(shù)據(jù)分離,Comparator也可以在下面兩種環(huán)境下使用:
1、類的設(shè)計(jì)師沒有考慮到比較問題而沒有實(shí)現(xiàn)Comparable,可以通過Comparator來實(shí)現(xiàn)排序而不必改變對(duì)象本身
2、可以使用多種排序標(biāo)準(zhǔn),比如升序、降序等。

完整代碼:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortObject {
    
public static void main(String[] args) {
        sortByComparable();
        sortByComparator();
    }

    
/**
     * 通過Comparable排序
     
*/
    
public static void sortByComparable() {
        List list 
= new ArrayList();
        list.add(
new Person("Coder"1));
        list.add(
new Person("King"3));
        list.add(
new Person("Dream"2));
        list.add(
new Person("Baby"4));

        System.out.println(
"--- Sort Before ---");
        printPerson(list);
        Collections.sort(list);
        System.out.println(
"--- After Sorted  ---");
        printPerson(list);
    }

    
/**
     * 通過Comparator排序
     
*/
    
public static void sortByComparator() {
        List list 
= new ArrayList();
        list.add(
new Person("Coder"1));
        list.add(
new Person("King"3));
        list.add(
new Person("Dream"2));
        list.add(
new Person("Baby"4));

        System.out.println(
"--- Sort Before ---");
        printPerson(list);
        Collections.sort(list, 
new PersonComparator());
        System.out.println(
"--- After Sorted  ---");
        printPerson(list);
    }

    
/**
     * 打印List
     * 
     * 
@param list
     
*/
    
public static void printPerson(List list) {
        
int size = list.size();
        Person p 
= null;
        
for (int i = 0; i < size; i++) {
            p 
= (Person) list.get(i);
            System.out.println(p.getName() 
+ ":" + p.getId());
        }
    }

}

class Person implements Comparable {
    
public String name;
    
public int id;

    
public Person() {
    }

    
public Person(String name, int id) {
        
this.name = name;
        
this.id = id;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public int getId() {
        
return id;
    }

    
public void setId(int id) {
        
this.id = id;
    }

    
public int compareTo(Object o) {
        Person p 
= (Person) o;
        
return this.getName().compareTo(p.getName());
    }
}

class PersonComparator implements Comparator {

    
public int compare(Object o1, Object o2) {
        Person p1 
= (Person) o1;
        Person p2 
= (Person) o2;
        
return p1.name.compareTo(p2.name);
    }
}
輸出結(jié)果:
--- Sort Before ---
Coder:1
King:3
Dream:2
Baby:4
--- After Sorted  ---
Baby:4
Coder:1
Dream:2
King:3
--- Sort Before ---
Coder:1
King:3
Dream:2
Baby:4
--- After Sorted  ---
Baby:4
Coder:1
Dream:2
King:3


參考:
1、Comparator和Comparable在排序中的應(yīng)用
2、 java中對(duì)于復(fù)雜對(duì)象排序的模型及其實(shí)現(xiàn) [轉(zhuǎn)]

CoderDream 2008-08-20 11:37 發(fā)表評(píng)論
]]>
HTML中的框架使用筆記http://www.aygfsteel.com/coderdream/archive/2008/06/18/208818.htmlCoderDreamCoderDreamWed, 18 Jun 2008 03:47:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/06/18/208818.htmlhttp://www.aygfsteel.com/coderdream/comments/208818.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/06/18/208818.html#Feedback3http://www.aygfsteel.com/coderdream/comments/commentRss/208818.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/208818.html效果:
左邊鏈接(包括錨點(diǎn))、右邊顯示
文件清單1:
<!-- ------------------------------ -->
<!--       文件范例:index.html      -->
<!--         文件說明:框架集       -->
<!-- ------------------------------ -->
<HTML>
    
<HEAD>
    
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML;CHARSET=UTF-8">
    
<TITLE>框架集</TITLE>
    
</HEAD>
    
<FRAMESET COLS="30%,70%">
        
<FRAME SRC=menu.html Scrolling="No">
        
<FRAME SRC=1.html Name="right">
    
</FRAMESET>
</HTML>
說明:
    1、<meta>標(biāo)簽放在<title>之前可以讓IE自動(dòng)選擇字符集,如UTF-8;
    2、第二個(gè)frame的name為“right”,這個(gè)值會(huì)在menu.html中用到;

文件清單2:
<!-- ------------------------------ -->
<!--    文件范例:menu.html    -->
<!--       文件說明:左側(cè)框架       -->
<!-- ------------------------------ -->
<HTML>
    
<HEAD>
        
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML;CHARSET=UTF-8">
        
<TITLE>左側(cè)框架</TITLE>
    
</HEAD>
    
<BODY>
        
<href="1.HTML" Target="right">《商業(yè)周刊》:iPhone2.0帶來的鯰魚效應(yīng)</A><P>
        1、
<href="1.HTML#a1" Target="right">無線運(yùn)營(yíng)商的日子更不好過</A><P>
        2、
<href="1.HTML#a2" Target="right">手機(jī)制造廠商們將更煩惱</A><P>
        3、
<href="1.HTML#a3" Target="right">iPhone帶來的沖擊會(huì)持續(xù)多久?</A><P>
        
<href="2.HTML" Target="right">Fireworks MX</A><P>
        
<href="3.HTML" Target="right">Flash MX</A><P>
    
</BODY>
</HTML>
說明:
    1、注意,這里<A>標(biāo)簽的target都為index.html中定義的"right"

文件清單3:
<!-- ------------------------------ -->
<!--  文件范例:1.html   -->
<!--      文件說明:右側(cè)框架一      -->
<!-- ------------------------------ -->
<HTML>
    
<HEAD>
        
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML;CHARSET=UTF-8">
        
<TITLE>右側(cè)框架一</TITLE>
        
<Style Type="text/css">
                <!--                    
                    .abc 
{                
                        font-weight
: bold;
                        font-size
: 18px;                
                    
}
                -->
        
</Style>
    
</HEAD>
<BODY>
<H1><name=aTitle>《商業(yè)周刊》:iPhone2.0帶來的鯰魚效應(yīng)</A></H1>

ugmbbc發(fā)布于 2008-06-17 08:26:20|2998 次閱讀 字體:大 小 打印預(yù)覽
<BR><BR>
 
  北京時(shí)間6月16日,《商業(yè)周刊》發(fā)表評(píng)論文章分析了iPhone2.0對(duì)無線運(yùn)營(yíng)商和手機(jī)制造商們帶來的沖擊,以下為其全文:
當(dāng)蘋果準(zhǔn)備憑著3G版iPhone再次吹響戰(zhàn)斗號(hào)角的時(shí)候,也是手機(jī)制造商和無線運(yùn)營(yíng)商們更加頭疼的時(shí)候.蘋果在手機(jī)市場(chǎng)中可謂旗開得勝,在iPhone 入市的第一年,蘋果就從競(jìng)爭(zhēng)對(duì)手RIM公司中搶過不少市場(chǎng)份額,而AT
&T作為 iPhone唯一授權(quán)的運(yùn)營(yíng)商,也從其競(jìng)爭(zhēng)對(duì)手Alltel和T-Mobile中吸引了不少用戶.可以想象,一個(gè)更便宜、速度更快、功能更全的 iPhone將帶來什么樣的沖擊.<BR><BR>

  將在7月面市的新版iPhone,不僅售價(jià)不到200美元、升級(jí)到更快的網(wǎng)絡(luò),而且新增了很多吸引普通消費(fèi)者以及商業(yè)用戶的功能.

  
<name=a1><class=abc>  無線運(yùn)營(yíng)商的日子更不好過</p></A>
  據(jù)業(yè)內(nèi)人士說,為了對(duì)付iPhone帶來的沖擊,無線服務(wù)運(yùn)營(yíng)商們不得不提高對(duì)手機(jī)的補(bǔ)貼、提高營(yíng)銷預(yù)算并降低一些服務(wù)的價(jià)格,所有這一切意味著利潤(rùn)空間的縮減.面對(duì)iPhone的沖擊,本來就已經(jīng)處在政府監(jiān)管日益增加以及直面Google競(jìng)爭(zhēng)的無線運(yùn)營(yíng)商們的日子更不好過了.
<BR><BR>

  在過去的一年里,美國(guó)的無線運(yùn)營(yíng)商們已經(jīng)在手機(jī)津貼上展開激烈競(jìng)爭(zhēng),通過增加對(duì)手機(jī)的補(bǔ)貼來獲得長(zhǎng)期無線服務(wù)合同.但現(xiàn)在AT
&T以 iPhone為誘惑來吸引用戶,對(duì)別的運(yùn)營(yíng)商來說,必須采取相應(yīng)的措施來吸引用戶,他們可能引進(jìn)類iPhone的手機(jī).但"大多數(shù)人要的是iPhone,就像他們喜歡iPod而不是其他MP3播放器一樣",東北大學(xué)營(yíng)銷系教授Gloria Barczak說到,"人們要的是真正的iPhone".因此,要想讓用戶被吸引,必須得有別的優(yōu)勢(shì),比如價(jià)格優(yōu)勢(shì)等.<BR><BR>

  為了留住高端用戶,運(yùn)營(yíng)商們需要加大業(yè)務(wù)推廣的力度.據(jù)廣告顧問公司TNS媒體情報(bào)的數(shù)據(jù),運(yùn)營(yíng)商Verizon無線今年第一季度的廣告支出增加了30%.
<BR><BR>

  Sprint Nextel同期的廣告開支下降20%,主要是由于自身的財(cái)務(wù)問題,當(dāng)看到用戶不斷流失的時(shí)候,Sprint Nextel應(yīng)該會(huì)加大廣告的投入."他們必須拿出能對(duì)抗iPhone誘惑的方案來,盡量發(fā)揮自己的長(zhǎng)處",顧問公司TMNG的CEO Rich Nespola說到.
<BR><BR>

  另一種留住用戶的方式是降低服務(wù)的價(jià)格.事實(shí)上,這是一個(gè)有效對(duì)付AT
&T的辦法.AT&T對(duì)提供iPhone的用戶增加了服務(wù)的價(jià)格,以彌補(bǔ)高額的津貼費(fèi)用."AT&T的對(duì)手們將在今年下半年繼續(xù)加強(qiáng)價(jià)格優(yōu)勢(shì),可能會(huì)有30%到40%的下降.當(dāng)人們因?yàn)楦哂蛢r(jià)開支增多的情況下,每月在無線服務(wù)上節(jié)省50美元也是很有吸引力的",Pali研究所的分析師Walter Piecyk說到,"因此,無線運(yùn)營(yíng)商的利潤(rùn)將從目前的40%下滑到30%".

  
<class=abc><name=a2>  手機(jī)制造廠商們將更煩惱</A></p>

  手機(jī)制造廠商們也正在因?yàn)閕Phone而大傷腦筋,盡管現(xiàn)在他們正受益于兩位數(shù)增長(zhǎng)的智能手機(jī)市場(chǎng).當(dāng)運(yùn)營(yíng)商們因iPhone而必須提高補(bǔ)貼的時(shí)候,他們會(huì)將壓力轉(zhuǎn)加到手機(jī)制造廠商頭上,進(jìn)而壓低手機(jī)價(jià)格.何況,如果iPhone真像分析師們預(yù)期那樣大賣的話,其他手機(jī)廠商的市場(chǎng)份額也會(huì)受到很大侵蝕.很久沒推出拳頭產(chǎn)品的摩托羅拉可能受創(chuàng)最重,三星、LG甚至諾基亞也會(huì)遭受沖擊,NPD集團(tuán)的主任分析師Ross Rubin說到,"高端、時(shí)尚機(jī)型將受沖擊最大".
<BR><BR>

  還有,為了趕上iPhone的技術(shù)水平和圖形表現(xiàn)能力,手機(jī)制造廠商們將不得不提高他們的軟件研發(fā)成本.去年售出300萬臺(tái)觸摸手機(jī)的 HTC,已經(jīng)開發(fā)了一種特殊的3D菜單,該菜單表現(xiàn)力強(qiáng)勁,把通訊錄做得就像在實(shí)際的紙制通訊錄中翻找一樣."我們希望能把用戶的觸摸體驗(yàn)提升到一個(gè)新的水平",HTC 首席營(yíng)銷官的John Wang說到.
<BR><BR>

  作為世界上最大手機(jī)制造商的諾基亞,在Ovi上投了大量資金,希望為它的智能手機(jī)建立一個(gè)集地圖、游戲和照片共享于一身的Web服務(wù)平臺(tái),這次在iPhone的刺激下也在加緊推出新服務(wù)."我們將繼續(xù)推出新服務(wù)",諾基亞美洲區(qū)副總裁Bill Plummer說到.

  
<class=abc><name=a3>  iPhone帶來的沖擊會(huì)持續(xù)多久?</A></p>

  iPhone帶來的沖擊將會(huì)持續(xù)多久?這個(gè)很難說.一個(gè)重量級(jí)手機(jī)的銷售要達(dá)到頂峰需要幾年的時(shí)間.摩托羅拉傳奇的RAZR系列手機(jī)在2004年推出,直到2007年一季度才達(dá)到銷售的頂峰,據(jù)NPD的數(shù)據(jù),當(dāng)時(shí)RAZR系列手機(jī)銷售占全美手機(jī)銷售的12%.
<BR><BR>
  雖然不好說那些別的智能手機(jī)和類iPhone的手機(jī)將會(huì)如何發(fā)展,但是"畢竟,重要的是,它們不是iPhone",Jupiter研究所分析師Neil Strother說到,"這不是在蘋果堆里挑蘋果".
<BR><BR>
</BODY>
</HTML>

文件清單4:
<!-- ------------------------------ -->
<!--   文件范例:2.html  -->
<!--      文件說明:右側(cè)框架二      -->
<!-- ------------------------------ -->
<HTML>
    
<HEAD>
        
<TITLE>右側(cè)框架二</TITLE>
        
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML;CHARSET=UTF-8">
    
</HEAD>
    
<BODY>
        
<H1>Fireworks MX</H1>
        Fireworks MX作為網(wǎng)頁(yè)圖像設(shè)計(jì)軟件的代表,在繼承了前期版本圖形繪制、頁(yè)面特效功能的同時(shí),大大地發(fā)展了位圖圖像方面的處理功能,這無疑使這個(gè)軟件有了向Photoshop挑戰(zhàn)的更多資本,而其在網(wǎng)頁(yè)設(shè)計(jì)方面的諸多應(yīng)用,又無任何軟件可與之媲美。與Dreamweaver MX的整合使其在專業(yè)網(wǎng)站圖像設(shè)計(jì)過程中,扮演著不可或缺的角色。
    
</BODY>
</HTML>

文件清單5:
<!-- ------------------------------ -->
<!--  文件范例:3.html   -->
<!--      文件說明:右側(cè)框架三      -->
<!-- ------------------------------ -->
<HTML>
    
<HEAD>
        
<TITLE>右側(cè)框架三</TITLE>
        
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML;CHARSET=UTF-8">
    
</HEAD>
    
<BODY>
<H1>Flash MX</H1>
Flash MX作為網(wǎng)頁(yè)矢量交互動(dòng)畫軟件的代表,提供了圖形繪制、動(dòng)畫制作和交互三大功能。掌握了這個(gè)軟件的核心,也就有能力在網(wǎng)上沖浪的同時(shí),充當(dāng)一把閃客的角色。越來越多的個(gè)人、商業(yè)網(wǎng)站采用Flash技術(shù)制作廣告Banner、動(dòng)畫片頭、MTV、交互游戲,其廣泛的應(yīng)用為Flash的學(xué)習(xí)者提供了廣闊的發(fā)展平臺(tái),學(xué)習(xí)Flash MX軟件更是一個(gè)具有誘惑力的過程。
    
</BODY>
</HTML>

源代碼

CoderDream 2008-06-18 11:47 發(fā)表評(píng)論
]]>
在Eclipse中設(shè)置Jar文件與SourceCode的關(guān)聯(lián)http://www.aygfsteel.com/coderdream/archive/2008/05/29/203839.htmlCoderDreamCoderDreamThu, 29 May 2008 06:57:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/05/29/203839.htmlhttp://www.aygfsteel.com/coderdream/comments/203839.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/05/29/203839.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/203839.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/203839.html
這是javaee.jar的設(shè)置畫面,其他Struts等等設(shè)置類似。


CoderDream 2008-05-29 14:57 發(fā)表評(píng)論
]]>
Java中為面板(JPanel)添加標(biāo)題http://www.aygfsteel.com/coderdream/archive/2008/04/29/197296.htmlCoderDreamCoderDreamTue, 29 Apr 2008 08:16:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/04/29/197296.htmlhttp://www.aygfsteel.com/coderdream/comments/197296.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/04/29/197296.html#Feedback1http://www.aygfsteel.com/coderdream/comments/commentRss/197296.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/197296.html需求:用實(shí)線把各個(gè)面板圈起來,然后把面板的名字寫在圈圈的左上角。

原始畫面:


由于原來的程序使用的是AWT中的Panel,而這個(gè)控件我們沒有設(shè)置titleBorder的方法。
現(xiàn)在將更新為Swing中的JPanel面板,代碼分別為:
舊代碼:
    Panel pRoboCtrl=new Panel();
    pRoboCtrl.setLayout(
new GridLayout(5125));
    
    
// Robot控制面板的第一排,面板的標(biāo)題
        Panel pR1=new Panel(); 
        pR1.setLayout(
new GridLayout(1123));
     
        
//Row One
    pR1.add(new Label("Robot Control",Label.CENTER));
新代碼:
    JPanel pRoboCtrl=new JPanel();
    pRoboCtrl.setLayout(
new GridLayout(4125));
    Border titleBorder1
=BorderFactory.createTitledBorder("Robot Control");            
    pRoboCtrl.setBorder(titleBorder1);   
原來的處理方式是將一個(gè)Label放到Panel中,然后將這個(gè)Panel放到外層的Panel中,新方式是將外層Panel定義成JPanel,然后設(shè)置Border的值為BorderFactory產(chǎn)生的一個(gè)實(shí)例。



解決這個(gè)問題后,新問題又來了,兩個(gè)JPanel中的內(nèi)容不一樣,上面多,下面少,但是現(xiàn)在面板卻是一樣大,要改成面板高度自動(dòng)適應(yīng)。
其實(shí)這只需要修改一行代碼就可以了,代碼如下:
舊代碼:
CP.setLayout(new GridLayout(3125));  
新代碼:
CP.setLayout(new BoxLayout(CP, BoxLayout.Y_AXIS)); // 沿垂直方向布置組件
舊代碼的處理方式是網(wǎng)格布局,新代碼的方式是用BoxLayout布局管理器,它會(huì)按要求垂直或水平分布。

以下代碼創(chuàng)建了一個(gè)JPanel容器,它采用垂直 BoxLayout,在這個(gè)容器中包含兩個(gè)Button,這兩個(gè)Button沿垂直方向分布,并且保持像素為 5 的固定垂直間隔。
    JPanel panel = new JPanel();
    panel.setLayout(
new BoxLayout(panel, BoxLayout.Y_AXIS));// 沿垂直方向布置組件
    panel.add(new JButton("Button1"));
    panel.add(Box.createVerticalStrut(
5));
    panel.add(
new JButton("Button2"));

源代碼:下載

CoderDream 2008-04-29 16:16 發(fā)表評(píng)論
]]>
Quartz學(xué)習(xí)筆記http://www.aygfsteel.com/coderdream/archive/2008/04/15/193175.htmlCoderDreamCoderDreamTue, 15 Apr 2008 09:46:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/04/15/193175.htmlhttp://www.aygfsteel.com/coderdream/comments/193175.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/04/15/193175.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/193175.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/193175.html http://www.opensymphony.com/quartz/download.action
https://quartz.dev.java.net/files/documents/1267/43545/quartz-1.6.0.zip

2、詳細(xì)講解Quartz如何從入門到精通
3、用 Quartz 進(jìn)行作業(yè)調(diào)度

CoderDream 2008-04-15 17:46 發(fā)表評(píng)論
]]>
Java 正則表達(dá)式(六)http://www.aygfsteel.com/coderdream/archive/2008/02/29/182685.htmlCoderDreamCoderDreamFri, 29 Feb 2008 01:49:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/29/182685.htmlhttp://www.aygfsteel.com/coderdream/comments/182685.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/29/182685.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182685.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182685.htmlJava程序員:一刻鐘精通正則表達(dá)式


  想必很多人都對(duì)正則表達(dá)式都頭疼。今天,我以我的認(rèn)識(shí),加上網(wǎng)上一些文章,希望用常人都可以理解的表達(dá)方式來和大家分享學(xué)習(xí)經(jīng)驗(yàn)。

  開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結(jié)束,以下分別舉例說明:

  "^The": 開頭一定要有"The"字符串;

  "of despair$": 結(jié)尾一定要有"of despair" 的字符串;

  那么,

  "^abc$": 就是要求以abc開頭和以abc結(jié)尾的字符串,實(shí)際上是只有abc匹配。

  "notice": 匹配包含notice的字符串。

  你可以看見如果你沒有用我們提到的兩個(gè)字符(最后一個(gè)例子),就是說 模式(正則表達(dá)式) 可以出現(xiàn)在被檢驗(yàn)字符串的任何地方,你沒有把他鎖定到兩邊。

  接著,說說 '*', '+',和 '?',

  他們用來表示一個(gè)字符可以出現(xiàn)的次數(shù)或者順序。 他們分別表示:

  "zero or more"相當(dāng)于{0,},

  "one or more"相當(dāng)于{1,},

  "zero or one."相當(dāng)于{0,1}, 這里是一些例子:

  "ab*": 和ab{0,}同義,匹配以a開頭,后面可以接0個(gè)或者N個(gè)b組成的字符串("a", "ab", "abbb", 等);

  "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個(gè)b存在 ("ab", "abbb", 等。);

  "ab?":和ab{0,1}同義,可以沒有或者只有一個(gè)b;

  "a?b+$": 匹配以一個(gè)或者0個(gè)a再加上一個(gè)以上的b結(jié)尾的字符串。

  要點(diǎn), '*', '+',和 '?'只管它前面那個(gè)字符。

  你也可以在大括號(hào)里面限制字符出現(xiàn)的個(gè)數(shù),比如

  "ab{2}": 要求a后面一定要跟兩個(gè)b(一個(gè)也不能少)("abb");

  "ab{2,}": 要求a后面一定要有兩個(gè)或者兩個(gè)以上b(如"abb", "abbbb", 等。);

  "ab{3,5}": 要求a后面可以有2-5個(gè)b("abbb", "abbbb", or "abbbbb")。

  現(xiàn)在我們把一定幾個(gè)字符放到小括號(hào)里,比如:

  "a(bc)*": 匹配 a 后面跟0個(gè)或者一個(gè)"bc";

  "a(bc){1,5}": 一個(gè)到5個(gè) "bc."

  還有一個(gè)字符 '│', 相當(dāng)于OR 操作:

  "hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;

  "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;

  "(a│b)*c": 匹配含有這樣多個(gè)(包括0個(gè))a或b,后面跟一個(gè)c的字符串;

  一個(gè)點(diǎn)('.')可以代表所有的單一字符,不包括"\n"

  如果,要匹配包括"\n"在內(nèi)的所有單個(gè)字符,怎么辦?

  對(duì)了,用'[\n.]'這種模式。

  "a.[0-9]": 一個(gè)a加一個(gè)字符再加一個(gè)0到9的數(shù)字

  "^.{3}$": 三個(gè)任意字符結(jié)尾 .

  中括號(hào)括住的內(nèi)容只匹配一個(gè)單一的字符

  "[ab]": 匹配單個(gè)的 a 或者 b ( 和 "a│b" 一樣);

  "[a-d]": 匹配'a' 到'd'的單個(gè)字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個(gè)大小寫英文

  "^[a-zA-Z]": 匹配以大小寫字母開頭的字符串

  "[0-9]%": 匹配含有 形如 x% 的字符串

  ",[a-zA-Z0-9]$": 匹配以逗號(hào)再加一個(gè)數(shù)字或字母結(jié)尾的字符串

  你也可以把你不想要得字符列在中括號(hào)里,你只需要在總括號(hào)里面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個(gè)百分號(hào)里面有一個(gè)非字母的字符串。

  要點(diǎn):^用在中括號(hào)開頭的時(shí)候,就表示排除括號(hào)里的字符。為了PHP能夠解釋,你必須在這些字符面前后加'',并且將一些字符轉(zhuǎn)義。

  不要忘記在中括號(hào)里面的字符是這條規(guī)路的例外?在中括號(hào)里面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質(zhì) "[*\+?{}.]"匹配含有這些字符的字符串。

  還有,正如regx的手冊(cè)告訴我們: "如果列表里含有 ']', 最好把它作為列表里的第一個(gè)字符(可能跟在'^'后面)。 如果含有'-', 最好把它放在最前面或者最后面, or 或者一個(gè)范圍的第二個(gè)結(jié)束點(diǎn)[a-d-0-9]中間的‘-’將有效。

  看了上面的例子,你對(duì){n,m}應(yīng)該理解了吧。要注意的是,n和m都不能為負(fù)整數(shù),而且n總是小于m. 這樣,才能 最少匹配n次且最多匹配m次。 如"p{1,5}"將匹配 "pvpppppp"中的前五個(gè)p.

  下面說說以\開頭的

  \b 書上說他是用來匹配一個(gè)單詞邊界,就是……比如've\b',可以匹配love里的ve而不匹配very里有ve

  \B 正好和上面的\b相反。例子我就不舉了

  ……突然想起來……可以到http://www.phpv.net/article.php/251 看看其它用\ 開頭的語(yǔ)法

  好,我們來做個(gè)應(yīng)用:

  如何構(gòu)建一個(gè)模式來匹配 貨幣數(shù)量 的輸入

  構(gòu)建一個(gè)匹配模式去檢查輸入的信息是否為一個(gè)表示money的數(shù)字。我們認(rèn)為一個(gè)表示money的數(shù)量有四種方式: "10000.00" 和 "10,000.00",或者沒有小數(shù)部分, "10000" and "10,000". 現(xiàn)在讓我們開始構(gòu)建這個(gè)匹配模式:

  ^[1-9][0-9]*$

  這是所變量必須以非0的數(shù)字開頭。但這也意味著 單一的 "0" 也不能通過測(cè)試。 以下是解決的方法:

  ^(0│[1-9][0-9]*)$

  "只有0和不以0開頭的數(shù)字與之匹配",我們也可以允許一個(gè)負(fù)號(hào)在數(shù)字之前:

  ^(0│-?[1-9][0-9]*)$

  這就是: "0 或者 一個(gè)以0開頭 且可能 有一個(gè)負(fù)號(hào)在前面的數(shù)字。" 好了,現(xiàn)在讓我們別那么嚴(yán)謹(jǐn),允許以0開頭?,F(xiàn)在讓我們放棄 負(fù)號(hào) , 因?yàn)槲覀冊(cè)诒硎惧X幣的時(shí)候并不需要用到。 我們現(xiàn)在指定 模式 用來匹配小數(shù)部分:

  ^[0-9]+(\.[0-9]+)?$

  這暗示匹配的字符串必須最少以一個(gè)阿拉伯?dāng)?shù)字開頭。 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以。 (你知道為什么嗎)

  ^[0-9]+(\.[0-9]{2})?$

  我們上面指定小數(shù)點(diǎn)后面必須有兩位小數(shù)。如果你認(rèn)為這樣太苛刻,你可以改成:

  ^[0-9]+(\.[0-9]{1,2})?$

  這將允許小數(shù)點(diǎn)后面有一到兩個(gè)字符。 現(xiàn)在我們加上用來增加可讀性的逗號(hào)(每隔三位), 我們可以這樣表示:

  ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$

  不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字符串被輸入話 (為什么?)。 也不要忘記反斜桿 ‘\’ 在php字符串中可能會(huì)出現(xiàn)錯(cuò)誤 (很普遍的錯(cuò)誤)。

  現(xiàn)在,我們已經(jīng)可以確認(rèn)字符串了, 我們現(xiàn)在把所有逗號(hào)都去掉 str_replace(",", "", $money) 然后在把類型看成 double然后我們就可以通過他做數(shù)學(xué)計(jì)算了。

  再來一個(gè):

  構(gòu)造檢查email的正則表達(dá)式

  在一個(gè)完整的email地址中有三個(gè)部分:

  1. 用戶名 (在 '@' 左邊的一切),

  2.'@',

  3. 服務(wù)器名(就是剩下那部分)。

  用戶名可以含有大小寫字母阿拉伯?dāng)?shù)字,句號(hào) ('.'), 減號(hào)('-'), and 下劃線 ('_')。 服務(wù)器名字也是符合這個(gè)規(guī)則,當(dāng)然下劃線除外。

  現(xiàn)在, 用戶名的開始和結(jié)束都不能是句點(diǎn)。 服務(wù)器也是這樣。 還有你不能有兩個(gè)連續(xù)的句點(diǎn)他們之間至少存在一個(gè)字符,好現(xiàn)在我們來看一下怎么為用戶名寫一個(gè)匹配模式:

  ^[_a-zA-Z0-9-]+$

  現(xiàn)在還不能允許句號(hào)的存在。 我們把它加上:

  ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$

  上面的意思就是說: "以至少一個(gè)規(guī)范字符(除了。)開頭,后面跟著0個(gè)或者多個(gè)以點(diǎn)開始的字符串。"

  簡(jiǎn)單化一點(diǎn), 我們可以用 eregi()取代 ereg()。eregi()對(duì)大小寫不敏感, 我們就不需要指定兩個(gè)范圍 "a-z" 和 "A-Z" ? 只需要指定一個(gè)就可以了:

  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$

  后面的服務(wù)器名字也是一樣,但要去掉下劃線:

  ^[a-z0-9-]+(\.[a-z0-9-]+)*$

  好。 現(xiàn)在只需要用“@”把兩部分連接:

  ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

  這就是完整的email認(rèn)證匹配模式了,只需要調(diào)用

  eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)

  就可以得到是否為email了。

  正則表達(dá)式的其他用法

  提取字符串

  ereg() and eregi() 有一個(gè)特性是允許用戶通過正則表達(dá)式去提取字符串的一部分(具體用法你可以閱讀手冊(cè))。 比如說,我們想從 path/URL 提取文件名 ? 下面的代碼就是你需要:

  ereg("([^\\/]*)$", $pathOrUrl, $regs);

  echo $regs[1];

  高級(jí)的代換

  ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負(fù)號(hào)都替換成逗號(hào):

  ereg_replace("[ \n\r\t]+", ",", trim($str));

  最后,我把另一串檢查EMAIL的正則表達(dá)式讓看文章的你來分析一下。

  "^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"

  如果能方便的讀懂,那這篇文章的目的就達(dá)到了。

原文地址:http://java.chinaitlab.com/base/732793.html



CoderDream 2008-02-29 09:49 發(fā)表評(píng)論
]]>
Java 正則表達(dá)式(七)http://www.aygfsteel.com/coderdream/archive/2008/02/29/182837.htmlCoderDreamCoderDreamFri, 29 Feb 2008 01:47:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/29/182837.htmlhttp://www.aygfsteel.com/coderdream/comments/182837.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/29/182837.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182837.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182837.html揭開正則表達(dá)式的神秘面紗
2、正則表達(dá)式話題
3、如何使用Java自帶的正則表達(dá)式
4、處理正則表達(dá)式的java包:regexp
5、Java正則表達(dá)式技巧總結(jié)
6、學(xué)點(diǎn)Java正則表達(dá)式
7、在JAVA中使用正則表達(dá)式
8、Java正則表達(dá)式(1)
9、java正則表達(dá)式; regular expression(2)
10、JAVA正則表達(dá)式(2)

CoderDream 2008-02-29 09:47 發(fā)表評(píng)論
]]>
Java 正則表達(dá)式(五)http://www.aygfsteel.com/coderdream/archive/2008/02/28/182669.htmlCoderDreamCoderDreamThu, 28 Feb 2008 06:35:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182669.htmlhttp://www.aygfsteel.com/coderdream/comments/182669.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182669.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182669.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182669.htmlJAVA 正則表達(dá)式實(shí)現(xiàn)

§1黑暗歲月

       有一個(gè)String,如何查詢其中是否有y和f字符?最黑暗的辦法就是:
程序1:我知道if、for語(yǔ)句和charAt()啊。
class Test{
  
public static void main(String args[]) {
         String str
="For my money, the important thing "+
         
"about the meeting was bridge-building";
         
char x='y';
         
char y='f';
         
boolean result=false;
         
for(int i=0;i<str.length();i++){
                
char z=str.charAt(i);  //System.out.println(z);
                if(x==z||y==z) {
                       result
=true;
                       
break;
                }
                
else result=false;
         }   
         System.out.println(result);
       }
}

       好像很直觀,但這種方式難以應(yīng)付復(fù)雜的工作。如查詢一段文字中,是否有is?是否有thing或ting等。這是一個(gè)討厭的工作。

§2 Java的java.util.regex包

       按照面向?qū)ο蟮乃悸?,把希望查詢的字符串如is、thing或ting封裝成一個(gè)對(duì)象,以這個(gè)對(duì)象作為模板去匹配一段文字,就更加自然了。作為模板的那個(gè)東西就是下面要討論的正則表達(dá)式。先不考慮那么復(fù)雜,看一個(gè)例子:
程序2:不懂。先看看可以吧?
import java.util.regex.*;
class Regex1{
  
public static void main(String args[]) {
         String str
="For my money, the important thing "+
         
"about the meeting was bridge-building";
         String regEx
="a|f";   //表示a或f 
         Pattern p=Pattern.compile(regEx);
         Matcher m
=p.matcher(str);
         
boolean result=m.find();
         System.out.println(result);
       }
}

       如果str匹配regEx,那么result為true,否則為flase。如果想在查找時(shí)忽略大小寫,則可以寫成:
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
       雖然暫時(shí)不知道Pattern(模板、模式)和Matcher(匹配器)的細(xì)節(jié),程序的感覺就比較爽,如果先查詢is、后來又要查詢thing或ting,我們只需要修改一下模板Pattern,而不是考慮if語(yǔ)句和for語(yǔ)句,或者通過charAt()。
1、寫一個(gè)特殊的字符串??正則表達(dá)式如a|f。
2、將正則表達(dá)式編譯成一個(gè)模板:p
3、用模板p去匹配字符串str。
       思路清楚了,現(xiàn)在看Java是如何處理的(Java程序員直到JDK1.4才能使用這些類。

§3 Pattern類與查找

       ①public final class java.util.regex.Pattern是正則表達(dá)式編譯后的表達(dá)法。下面的語(yǔ)句將創(chuàng)建一個(gè)Pattern對(duì)象并賦值給句柄p:Pattern p=Pattern.compile(regEx);
       有趣的是,Pattern類是final類,而且它的構(gòu)造器是private。也許有人告訴你一些設(shè)計(jì)模式的東西,或者你自己查有關(guān)資料。這里的結(jié)論是:Pattern類不能被繼承,我們不能通過new創(chuàng)建Pattern類的對(duì)象。
       因此在Pattern類中,提供了2個(gè)重載的靜態(tài)方法,其返回值是Pattern對(duì)象(的引用)。如:
    public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }
       當(dāng)然,我們可以聲明Pattern類的句柄,如Pattern p=null;
       ②p.matcher(str)表示以用模板p去生成一個(gè)字符串str的匹配器,它的返回值是一個(gè)Matcher類的引用,為什么要這個(gè)東西呢?按照自然的想法,返回一個(gè)boolean值不行嗎?
       我們可以簡(jiǎn)單的使用如下方法:
       boolean result=Pattern.compile(regEx).matcher(str).find();
       呵呵,其實(shí)是三個(gè)語(yǔ)句合并的無句柄方式。無句柄常常不是好方式。后面再學(xué)習(xí)Matcher類吧。先看看regEx??這個(gè)怪咚咚。

§4 正則表達(dá)式之限定符

       正則表達(dá)式(Regular Expression)是一種生成字符串的字符串。暈吧。比如說,String regEx="me+";這里字符串me+能夠生成的字符串是:me、mee、meee、meeeeeeeeee等等,一個(gè)正則表達(dá)式可能生成無窮的字符串,所以我們不可能(有必要嗎?)輸出正則表達(dá)式產(chǎn)生的所有東西。
反過來考慮,對(duì)于字符串:me、mee、meee、meeeeeeeeee等等,我們能否有一種語(yǔ)言去描述它們呢?顯然,正則表達(dá)式語(yǔ)言是這種語(yǔ)言,它是一些字符串的模式??簡(jiǎn)潔而深刻的描述。
我們使用正則表達(dá)式,用于字符串查找、匹配、指定字符串替換、字符串分割等等目的。
 
       生成字符串的字符串??正則表達(dá)式,真有些復(fù)雜,因?yàn)槲覀兿M善胀ㄗ址ɡ缱址?nbsp;a 到 z)以及特殊字符(稱為元字符)描述任意的字符串,而且要準(zhǔn)確。
       先搞幾個(gè)正則表達(dá)式例子:
       程序3:我們總用這個(gè)程序測(cè)試正則表達(dá)式。
import java.util.regex.*;

class Regex1{
  
public static void main(String args[]) {
         String str
="For my money, the important thing "
         String regEx
="ab*"
         
boolean result=Pattern.compile(regEx).matcher(str).find();
         System.out.println(result);
       }
}
//ture

①"ab*"??能匹配a、ab、abb、abbb……。所以,*表示前面字符可以有零次或多次。如果僅僅考慮查找,直接用"a"也一樣。但想想替換的情況。 問題regEx="abb*"結(jié)果如何?
②"ab+"??能匹配ab、abb、abbb……。等價(jià)于"abb*"。問題regEx="or+"結(jié)果如何?
③"or?"??能匹配o和or。? 表示前面字符可以有零次或一次。
       這些限定符*、+、?方便地表示了其前面字符(子串)出現(xiàn)的次數(shù)(我們用{}來描述):
x*    零次或多次 ≡{0,}
x+    一次或多次 ≡{1,}
x?    零次或一次 ≡{0,1}
x{n}    n次(n>0)
x{n,m}    最少n次至最多m次(0<n<m)
x{n,}    最少n次,
       
現(xiàn)在我們知道了連續(xù)字符串的查找、匹配。下面的是一些練習(xí)題:
①查找粗體字符串(不要求精確或要求精確匹配),寫出其正則表達(dá)式:
str    regEX(不要求精確)    regEX(要求精確)    試一試
abcffd    b或bcff或bcf*或bc*或bc+    bcff或bcf{2}    bc{3}
gooooogle    o{1,}、o+    o{5}     
banana    (an)+    (an){2}a、a(na) {2}         
                
②正則表達(dá)式匹配字符串,輸出是什么?

§5替換(刪除)、Matcher類

        現(xiàn)在我們可能厭煩了true/false,我們看看替換。如把book,google替換成bak(這個(gè)文件后綴名,在EditPlus中還行)、look或goooogle。
        程序4:字符串的替換。
import java.util.regex.*;

class Regex1{
       
public static void main(String args[]) {
              String regEx
="a+";//表示一個(gè)或多個(gè)a
              String str="abbbaaa an banana hhaana";
              Pattern p
=Pattern.compile(regEx);
              Matcher m
=p.matcher(str);
              String s
=m.replaceAll("⊙⊙"); // ("") 刪除
              System.out.println(s);
       }
}    
    
       這個(gè)程序與前面的程序的區(qū)別,在于使用了m.replaceAll(String)方法??磥鞰atcher類還有點(diǎn)用處。
①  Matcher是一個(gè)匹配器。可以把他看成一個(gè)人,一手拿著模子(Pattern類的對(duì)象),一手拿著一個(gè)字符序列(CharSequence),通過解釋該模子而對(duì)字符序列進(jìn)行匹配操作(match operations)。常常我們這樣編程:“喂,模子p,你和字符串str一起創(chuàng)建一個(gè)匹配器對(duì)象”。即Matcher m=p.matcher(str);
②  m可以進(jìn)行一些操作,如public String replaceAll(String replacement),它以replacement替換所有匹配的字符串。

§6正則表達(dá)式之特殊字符

我們熟悉這樣一個(gè)字符串"\n" 如:System.out.print(s+"\nbbb");這是Java中常用的轉(zhuǎn)移字符之一。其實(shí)轉(zhuǎn)移字符就是一種正則表達(dá)式,它使用了特殊字符 \ 。
 
下面是正則表達(dá)式中常用的特殊字符:
匹配次數(shù)符號(hào)    *    +    ?    {n}、{n,}、{n,m}
“或”符號(hào)    |     程序2已經(jīng)使用過了
句點(diǎn)符號(hào)    .     句點(diǎn)符號(hào)匹配所有字符(一個(gè)),包括空格、Tab字符甚至換行符。
方括號(hào)    [ ]   僅僅匹配方括號(hào)其中的字符)
圓括號(hào)    ()    分組,圓括號(hào)中的字符視為一個(gè)整體。
連字符    -     表示一個(gè)范圍。 
“否”符號(hào)    ^    表示不希望被匹配的字符(排除)

我們一下子學(xué)不了太多的東西,這不是正則表達(dá)式的全部?jī)?nèi)容和用法。但已經(jīng)夠我們忙活的了。我們用程序4 驗(yàn)證。(⊙⊙表示替換的字符)
①    regEx為下列字符串時(shí),能夠表示什么?
regEx    匹配    測(cè)試用str
(a|b){2}    aa、ab、bb、ba    aabbfooaabfooabfoob
a[abc]b    aab、abb、acb    3dfacb5ooyfo6abbfooaab
.     all string    3dfac
a.     aa、ax……等等    3dfacgg
d[^j]a    daa、d9a等等,除dja    3dfacggdjad5a
[d-g][ac]c    dac、ecc、gac等    3dfacggggccad5c
[d-g].{2}c    d⊙⊙c……    3dfacggggccad5c
g{1,10}    g、ggg……    3dfacggggccad5c
[a|c][^a]         3dfacggggccad5c
 
②    下列字符串如何用regEx表示?
測(cè)試用str    匹配    regEx
aabbfoaoabfooafobob     a⊙⊙b    a..b
aabbfoaaobfooafbob    a⊙b、除aab    a[^a]b、
gooooooogle    oooo……變成oo    o{2,20}
一本書中的“tan”、“ten”、“tin”和“ton”    t.n、t[aeio]n
abcaccbcbaacabccaa    刪除ac、ca    (ca)|(ac)
abccbcbaabca    再刪除ab、ba    結(jié)果ccbcca(如何與上面的合并)
                   
注:
        1、String str="一本書中的tan、ten、tin和ton"; 
        輸出:     一本書中的⊙⊙、⊙⊙、⊙⊙和⊙⊙
        2、String str=" abcaccbcbaacabccaa "; 輸出:ccbcca
       程序5:if、for語(yǔ)句和charAt(),886。
import java.util.regex.*;

class Regex1{
    
public static void main(String args[]) {
           String str
="abcaccbcbaacabccaa";
           String regEx
="(ac)|(ca)";
           Pattern p
=Pattern.compile(regEx);
           Matcher m
=p.matcher(str);
           String s
=m.replaceAll("");//⊙⊙
           regEx="(ab)|(ba)";
           p
=Pattern.compile(regEx);
           s
=p.matcher(s).replaceAll("");
 
           System.out.print(s
+"\n");
    }
}

§7 開始

好像我們知道了一些正則表達(dá)式與 Java的知識(shí),事實(shí)上,我們才剛剛開始。這里列出我們知道的東西,也說一點(diǎn)我們不知道的東西。
① Java在JDK1.4引入了(java.util.regex包)以支持正則表達(dá)式,包中有兩個(gè)類,分別是Pattern和Matcher。它們都有很多的方法,我們還不知道。String類中的split、matches方法等等也使用到了正則表達(dá)式。StringTokenizer是否沒有用處了?
② 正則表達(dá)式是一門語(yǔ)言。有許多正則表達(dá)式語(yǔ)法、選項(xiàng)和特殊字符,在Pattern.java源文件中大家可以查看??赡鼙认胂笾械囊獜?fù)雜。系統(tǒng)學(xué)習(xí)正則表達(dá)式的歷史、語(yǔ)法、全部特殊字符(相當(dāng)于Java中的關(guān)鍵字的地位),組合邏輯是下一步的事情。
③ 正則表達(dá)式是文本處理的重要技術(shù),在Perl、PHP、Python、JavaScript、Java、C#中被廣泛支持。被列為“保證你現(xiàn)在和未來不失業(yè)的十種關(guān)鍵技術(shù)”,呵呵,信不信由你

CoderDream 2008-02-28 14:35 發(fā)表評(píng)論
]]>
Java 正則表達(dá)式(四)http://www.aygfsteel.com/coderdream/archive/2008/02/28/182662.htmlCoderDreamCoderDreamThu, 28 Feb 2008 05:41:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182662.htmlhttp://www.aygfsteel.com/coderdream/comments/182662.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182662.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182662.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182662.html
  正則表達(dá)式在字符串處理上有著強(qiáng)大的功能,sun在jdk1.4加入了對(duì)它的支持

  下面簡(jiǎn)單的說下它的4種常用功能:
  
  查詢:
  
以下是代碼片段:
String str="abc efg ABC";

String regEx="a|f"; //表示a或f

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

  
  如果str中有regEx,那么rs為true,否則為flase。如果想在查找時(shí)忽略大小寫,則可以寫成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
  
  提?。?/strong>

以下是代碼片段:
String regEx=".+\(.+)$";

String str="c:\dir1\dir2\name.txt";

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher(str);

boolean rs=m.find();

for(int i=1;i<=m.groupCount();i++){

System.out.println(m.group(i));

}

  
  以上的執(zhí)行結(jié)果為name.txt,提取的字符串儲(chǔ)存在m.group(i)中,其中i最大值為m.groupCount();
  
  分割:
  
以下是代碼片段:
String regEx="::";

Pattern p=Pattern.compile(regEx);

String[] r=p.split("xd::abc::cde");

執(zhí)行后,r就是{"xd","abc","cde"},其實(shí)分割時(shí)還有跟簡(jiǎn)單的方法:

String str="xd::abc::cde";

String[] r=str.split("::");

  
  替換(刪除):
  
以下是代碼片段:
String regEx="a+"; //表示一個(gè)或多個(gè)a

Pattern p=Pattern.compile(regEx);

Matcher m=p.matcher("aaabbced a ccdeaa");

String s=m.replaceAll("A");
  
  結(jié)果為"Abbced A ccdeA"
  
  如果寫成空串,既可達(dá)到刪除的功能,比如:
  
String s=m.replaceAll("");
  
  結(jié)果為"bbced ccde"
  
  附:
  
     \D 等於 [^0-9] 非數(shù)字
     \s 等於 [ \t\n\x0B\f ] 空白字元
     \S 等於 [^ \t\n\x0B\f ] 非空白字元
     \w 等於 [a-zA-Z_0-9] 數(shù)字或是英文字
  \W 等於 [^a-zA-Z_0-9] 非數(shù)字與英文字
  
  ^ 表示每行的開頭
  $ 表示每行的結(jié)尾

原文地址:http://java.chinaitlab.com/advance/350770.html


]]>
Java 正則表達(dá)式(三)http://www.aygfsteel.com/coderdream/archive/2008/02/28/182645.htmlCoderDreamCoderDreamThu, 28 Feb 2008 05:35:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182645.htmlhttp://www.aygfsteel.com/coderdream/comments/182645.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182645.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182645.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182645.html如果你曾經(jīng)用過Perl或任何其他內(nèi)建正則表達(dá)式支持的語(yǔ)言,你一定知道用正則表達(dá)式處理文本和匹配模式是多么簡(jiǎn)單。如果你不熟悉這個(gè)術(shù)語(yǔ),那么“正則表達(dá)式”(Regular Expression)就是一個(gè)字符構(gòu)成的串,它定義了一個(gè)用來搜索匹配字符串的模式。

許多語(yǔ)言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達(dá)式處理文本,一些文本編輯器用正則表達(dá)式實(shí)現(xiàn)高級(jí)“搜索-替換”功能。那么Java又怎樣呢?本文寫作時(shí),一個(gè)包含了用正則表達(dá)式進(jìn)行文本處理的Java規(guī)范需求(Specification Request)已經(jīng)得到認(rèn)可,你可以期待在JDK的下一版本中看到它。

然而,如果現(xiàn)在就需要使用正則表達(dá)式,又該怎么辦呢?你可以從Apache.org下載源代碼開放的Jakarta-ORO庫(kù)。本文接下來的內(nèi)容先簡(jiǎn)要地介紹正則表達(dá)式的入門知識(shí),然后以Jakarta-ORO API為例介紹如何使用正則表達(dá)式。

一、正則表達(dá)式基礎(chǔ)知識(shí)

我們先從簡(jiǎn)單的開始。假設(shè)你要搜索一個(gè)包含字符“cat”的字符串,搜索用的正則表達(dá)式就是“cat”。如果搜索對(duì)大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:

1.1 句點(diǎn)符號(hào)

假設(shè)你在玩英文拼字游戲,想要找出三個(gè)字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結(jié)束。另外,假設(shè)有一本英文字典,你可以用正則表達(dá)式搜索它的全部?jī)?nèi)容。要構(gòu)造出這個(gè)正則表達(dá)式,你可以使用一個(gè)通配符——句點(diǎn)符號(hào)“.”。這樣,完整的表達(dá)式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因?yàn)榫潼c(diǎn)符號(hào)匹配所有字符,包括空格、Tab字符甚至換行符:

1.2 方括號(hào)符號(hào)

為了解決句點(diǎn)符號(hào)匹配范圍過于廣泛這一問題,你可以在方括號(hào)(“[]”)里面指定看來有意義的字符。此時(shí),只有方括號(hào)里面指定的字符才參與匹配。也就是說,正則表達(dá)式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因?yàn)樵诜嚼ㄌ?hào)之內(nèi)你只能匹配單個(gè)字符:

1.3 “或”符號(hào)

如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運(yùn)算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達(dá)式。這里不能使用方擴(kuò)號(hào),因?yàn)榉嚼ㄌ?hào)只允許匹配單個(gè)字符;這里必須使用圓括號(hào)“()”。圓括號(hào)還可以用來分組,具體請(qǐng)參見后面介紹。

1.4 表示匹配次數(shù)的符號(hào)

表一顯示了表示匹配次數(shù)的符號(hào),這些符號(hào)用來確定緊靠該符號(hào)左邊的符號(hào)出現(xiàn)的次數(shù):

 

假設(shè)我們要在文本文件中搜索美國(guó)的社會(huì)安全號(hào)碼。這個(gè)號(hào)碼的格式是999-99-9999。用來匹配它的正則表達(dá)式如圖一所示。在正則表達(dá)式中,連字符(“-”)有著特殊的意義,它表示一個(gè)范圍,比如從0到9。因此,匹配社會(huì)安全號(hào)碼中的連字符號(hào)時(shí),它的前面要加上一個(gè)轉(zhuǎn)義字符“\”。

 

圖一:匹配所有123-12-1234形式的社會(huì)安全號(hào)碼

 

假設(shè)進(jìn)行搜索的時(shí)候,你希望連字符號(hào)可以出現(xiàn),也可以不出現(xiàn)——即,999-99-9999和999999999都屬于正確的格式。這時(shí),你可以在連字符號(hào)后面加上“?”數(shù)量限定符號(hào),如圖二所示:

 

圖二:匹配所有123-12-1234和123121234形式的社會(huì)安全號(hào)碼

 

下面我們?cè)賮砜戳硗庖粋€(gè)例子。美國(guó)汽車牌照的一種格式是四個(gè)數(shù)字加上二個(gè)字母。它的正則表達(dá)式前面是數(shù)字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。圖三顯示了完整的正則表達(dá)式。

 

圖三:匹配典型的美國(guó)汽車牌照號(hào)碼,如8836KV

 

1.5 “否”符號(hào)

“^”符號(hào)稱為“否”符號(hào)。如果用在方括號(hào)內(nèi),“^”表示不想要匹配的字符。例如,圖四的正則表達(dá)式匹配所有單詞,但以“X”字母開頭的單詞除外。

 

圖四:匹配所有單詞,但“X”開頭的除外

 

1.6 圓括號(hào)和空白符號(hào)

假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達(dá)式可以如圖五所示:

 

圖五:匹配所有Moth DD,YYYY格式的日期

 

新出現(xiàn)的“\s”符號(hào)是空白符號(hào),匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個(gè)圓括號(hào)創(chuàng)建一個(gè)組,然后用ORO API(本文后面詳細(xì)討論)提取出它的值。修改后的正則表達(dá)式如圖六所示:

 

圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個(gè)組

 

1.7 其它符號(hào)

為簡(jiǎn)便起見,你可以使用一些為常見正則表達(dá)式創(chuàng)建的快捷符號(hào)。如表二所示:

表二:常用符號(hào)

 

例如,在前面社會(huì)安全號(hào)碼的例子中,所有出現(xiàn)“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達(dá)式如圖七所示:

 

圖七:匹配所有123-12-1234格式的社會(huì)安全號(hào)碼

 

二、Jakarta-ORO庫(kù)

有許多源代碼開放的正則表達(dá)式庫(kù)可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達(dá)式語(yǔ)法。我在這里選用的是Jakarta-ORO正則表達(dá)式庫(kù),它是最全面的正則表達(dá)式API之一,而且它與Perl 5正則表達(dá)式完全兼容。另外,它也是優(yōu)化得最好的API之一。

Jakarta-ORO庫(kù)以前叫做OROMatcher,Daniel Savarese大方地把它贈(zèng)送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。

我首先將簡(jiǎn)要介紹使用Jakarta-ORO庫(kù)時(shí)你必須創(chuàng)建和訪問的對(duì)象,然后介紹如何使用Jakarta-ORO API。

▲ PatternCompiler對(duì)象

首先,創(chuàng)建一個(gè)Perl5Compiler類的實(shí)例,并把它賦值給PatternCompiler接口對(duì)象。Perl5Compiler是PatternCompiler接口的一個(gè)實(shí)現(xiàn),允許你把正則表達(dá)式編譯成用來匹配的Pattern對(duì)象。

▲ Pattern對(duì)象

要把正則表達(dá)式編譯成Pattern對(duì)象,調(diào)用compiler對(duì)象的compile()方法,并在調(diào)用參數(shù)中指定正則表達(dá)式。例如,你可以按照下面這種方式編譯正則表達(dá)式“t[aeio]n”:

默認(rèn)情況下,編譯器創(chuàng)建一個(gè)大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要?jiǎng)?chuàng)建一個(gè)大小寫不敏感的模式,你應(yīng)該在調(diào)用編譯器的時(shí)候指定一個(gè)額外的參數(shù):

創(chuàng)建好Pattern對(duì)象之后,你就可以通過PatternMatcher類用該P(yáng)attern對(duì)象進(jìn)行模式匹配。

▲ PatternMatcher對(duì)象

PatternMatcher對(duì)象根據(jù)Pattern對(duì)象和字符串進(jìn)行匹配檢查。你要實(shí)例化一個(gè)Perl5Matcher類并把結(jié)果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個(gè)實(shí)現(xiàn),它根據(jù)Perl 5正則表達(dá)式語(yǔ)法進(jìn)行模式匹配:

使用PatternMatcher對(duì)象,你可以用多個(gè)方法進(jìn)行匹配操作,這些方法的第一個(gè)參數(shù)都是需要根據(jù)正則表達(dá)式進(jìn)行匹配的字符串:

· boolean matches(String input, Pattern pattern):當(dāng)輸入字符串和正則表達(dá)式要精確匹配時(shí)使用。換句話說,正則表達(dá)式必須完整地描述輸入字符串。

· boolean matchesPrefix(String input, Pattern pattern):當(dāng)正則表達(dá)式匹配輸入字符串起始部分時(shí)使用。

· boolean contains(String input, Pattern pattern):當(dāng)正則表達(dá)式要匹配輸入字符串的一部分時(shí)使用(即,它必須是一個(gè)子串)。

另外,在上面三個(gè)方法調(diào)用中,你還可以用PatternMatcherInput對(duì)象作為參數(shù)替代String對(duì)象;這時(shí),你可以從字符串中最后一次匹配的位置開始繼續(xù)進(jìn)行匹配。當(dāng)字符串可能有多個(gè)子串匹配給定的正則表達(dá)式時(shí),用PatternMatcherInput對(duì)象作為參數(shù)就很有用了。用PatternMatcherInput對(duì)象作為參數(shù)替代String時(shí),上述三個(gè)方法的語(yǔ)法如下:

· boolean matches(PatternMatcherInput input, Pattern pattern)

· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)

· boolean contains(PatternMatcherInput input, Pattern pattern)

三、應(yīng)用實(shí)例

下面我們來看看Jakarta-ORO庫(kù)的一些應(yīng)用實(shí)例。

3.1 日志文件處理

任務(wù):分析一個(gè)Web服務(wù)器日志文件,確定每一個(gè)用戶花在網(wǎng)站上的時(shí)間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:

分析這個(gè)日志記錄,可以發(fā)現(xiàn),要從這個(gè)日志文件提取的內(nèi)容有兩項(xiàng):IP地址和頁(yè)面訪問時(shí)間。你可以用分組符號(hào)(圓括號(hào))從日志記錄提取出IP地址和時(shí)間標(biāo)記。

首先我們來看看IP地址。IP地址有4個(gè)字節(jié)構(gòu)成,每一個(gè)字節(jié)的值在0到255之間,各個(gè)字節(jié)通過一個(gè)句點(diǎn)分隔。因此,IP地址中的每一個(gè)字節(jié)有至少一個(gè)、最多三個(gè)數(shù)字。圖八顯示了為IP地址編寫的正則表達(dá)式:

 

圖八:匹配IP地址

 

IP地址中的句點(diǎn)字符必須進(jìn)行轉(zhuǎn)義處理(前面加上“\”),因?yàn)镮P地址中的句點(diǎn)具有它本來的含義,而不是采用正則表達(dá)式語(yǔ)法中的特殊含義。句點(diǎn)在正則表達(dá)式中的特殊含義本文前面已經(jīng)介紹。

日志記錄的時(shí)間部分由一對(duì)方括號(hào)包圍。你可以按照如下思路提取出方括號(hào)里面的所有內(nèi)容:首先搜索起始方括號(hào)字符(“[”),提取出所有不超過結(jié)束方括號(hào)字符(“]”)的內(nèi)容,向前尋找直至找到結(jié)束方括號(hào)字符。圖九顯示了這部分的正則表達(dá)式。

 

圖九:匹配至少一個(gè)字符,直至找到“]”

 

現(xiàn)在,把上述兩個(gè)正則表達(dá)式加上分組符號(hào)(圓括號(hào))后合并成單個(gè)表達(dá)式,這樣就可以從日志記錄提取出IP地址和時(shí)間。注意,為了匹配“- -”(但不提取它),正則表達(dá)式中間加入了“\s-\s-\s”。完整的正則表達(dá)式如圖十所示。

 

圖十:匹配IP地址和時(shí)間標(biāo)記

 

現(xiàn)在正則表達(dá)式已經(jīng)編寫完畢,接下來可以編寫使用正則表達(dá)式庫(kù)的Java代碼了。

為使用Jakarta-ORO庫(kù),首先創(chuàng)建正則表達(dá)式字符串和待分析的日志記錄字符串:

這里使用的正則表達(dá)式與圖十的正則表達(dá)式差不多完全相同,但有一點(diǎn)例外:在Java中,你必須對(duì)每一個(gè)向前的斜杠(“\”)進(jìn)行轉(zhuǎn)義處理。圖十不是Java的表示形式,所以我們要在每個(gè)“\”前面加上一個(gè)“\”以免出現(xiàn)編譯錯(cuò)誤。遺憾的是,轉(zhuǎn)義處理過程很容易出現(xiàn)錯(cuò)誤,所以應(yīng)該小心謹(jǐn)慎。你可以首先輸入未經(jīng)轉(zhuǎn)義處理的正則表達(dá)式,然后從左到右依次把每一個(gè)“\”替換成“\\”。如果要復(fù)檢,你可以試著把它輸出到屏幕上。

初始化字符串之后,實(shí)例化PatternCompiler對(duì)象,用PatternCompiler編譯正則表達(dá)式創(chuàng)建一個(gè)Pattern對(duì)象:

現(xiàn)在,創(chuàng)建PatternMatcher對(duì)象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:

接下來,利用PatternMatcher接口返回的MatchResult對(duì)象,輸出匹配的組。由于logEntry字符串包含匹配的內(nèi)容,你可以看到類如下面的輸出:

3.2 HTML處理實(shí)例一

下面一個(gè)任務(wù)是分析HTML頁(yè)面內(nèi)FONT標(biāo)記的所有屬性。HTML頁(yè)面內(nèi)典型的FONT標(biāo)記如下所示:

程序?qū)凑杖缦滦问?,輸出每一個(gè)FONT標(biāo)記的屬性:

在這種情況下,我建議你使用兩個(gè)正則表達(dá)式。第一個(gè)如圖十一所示,它從字體標(biāo)記提取出“"face="Arial, Serif" size="+2" color="red"”。

 

圖十一:匹配FONT標(biāo)記的所有屬性

 

第二個(gè)正則表達(dá)式如圖十二所示,它把各個(gè)屬性分割成名字-值對(duì)。

 

圖十二:匹配單個(gè)屬性,并把它分割成名字-值對(duì)

 

分割結(jié)果為:

現(xiàn)在我們來看看完成這個(gè)任務(wù)的Java代碼。首先創(chuàng)建兩個(gè)正則表達(dá)式字符串,用Perl5Compiler把它們編譯成Pattern對(duì)象。編譯正則表達(dá)式的時(shí)候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項(xiàng),使得匹配操作不區(qū)分大小寫。

接下來,創(chuàng)建一個(gè)執(zhí)行匹配操作的Perl5Matcher對(duì)象。

假設(shè)有一個(gè)String類型的變量html,它代表了HTML文件中的一行內(nèi)容。如果html字符串包含F(xiàn)ONT標(biāo)記,匹配器將返回true。此時(shí),你可以用匹配器對(duì)象返回的MatchResult對(duì)象獲得第一個(gè)組,它包含了FONT的所有屬性:

接下來創(chuàng)建一個(gè)PatternMatcherInput對(duì)象。這個(gè)對(duì)象允許你從最后一次匹配的位置開始繼續(xù)進(jìn)行匹配操作,因此,它很適合于提取FONT標(biāo)記內(nèi)屬性的名字-值對(duì)。創(chuàng)建PatternMatcherInput對(duì)象,以參數(shù)形式傳入待匹配的字符串。然后,用匹配器實(shí)例提取出每一個(gè)FONT的屬性。這通過指定PatternMatcherInput對(duì)象(而不是字符串對(duì)象)為參數(shù),反復(fù)地調(diào)用PatternMatcher對(duì)象的contains()方法完成。PatternMatcherInput對(duì)象之中的每一次迭代將把它內(nèi)部的指針向前移動(dòng),下一次檢測(cè)將從前一次匹配位置的后面開始。

本例的輸出結(jié)果如下:

3.3 HTML處理實(shí)例二

下面我們來看看另一個(gè)處理HTML的例子。這一次,我們假定Web服務(wù)器從widgets.acme.com移到了newserver.acme.com。現(xiàn)在你要修改一些頁(yè)面中的鏈接:

執(zhí)行這個(gè)搜索的正則表達(dá)式如圖十三所示:

 

圖十三:匹配修改前的鏈接

 

如果能夠匹配這個(gè)正則表達(dá)式,你可以用下面的內(nèi)容替換圖十三的鏈接:

注意#字符的后面加上了$1。Perl正則表達(dá)式語(yǔ)法用$1、$2等表示已經(jīng)匹配且提取出來的組。圖十三的表達(dá)式把所有作為一個(gè)組匹配和提取出來的內(nèi)容附加到鏈接的后面。

現(xiàn)在,返回Java。就象前面我們所做的那樣,你必須創(chuàng)建測(cè)試字符串,創(chuàng)建把正則表達(dá)式編譯到Pattern對(duì)象所必需的對(duì)象,以及創(chuàng)建一個(gè)PatternMatcher對(duì)象:

接下來,用com.oroinc.text.regex包Util類的substitute()靜態(tài)方法進(jìn)行替換,輸出結(jié)果字符串:

Util.substitute()方法的語(yǔ)法如下:

這個(gè)調(diào)用的前兩個(gè)參數(shù)是以前創(chuàng)建的PatternMatcher和Pattern對(duì)象。第三個(gè)參數(shù)是一個(gè)Substiution對(duì)象,它決定了替換操作如何進(jìn)行。本例使用的是Perl5Substitution對(duì)象,它能夠進(jìn)行Perl5風(fēng)格的替換。第四個(gè)參數(shù)是想要進(jìn)行替換操作的字符串,最后一個(gè)參數(shù)允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數(shù)。

【結(jié)束語(yǔ)】在這篇文章中,我為你介紹了正則表達(dá)式的強(qiáng)大功能。只要正確運(yùn)用,正則表達(dá)式能夠在字符串提取和文本修改中起到很大的作用。另外,我還介紹了如何在Java程序中通過Jakarta-ORO庫(kù)利用正則表達(dá)式。至于最終采用老式的字符串處理方式(使用StringTokenizer,charAt,和substring),還是采用正則表達(dá)式,這就有待你自己決定了


原文地址:http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp

]]>
Java 正則表達(dá)式(二)http://www.aygfsteel.com/coderdream/archive/2008/02/28/182643.htmlCoderDreamCoderDreamThu, 28 Feb 2008 03:49:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182643.htmlhttp://www.aygfsteel.com/coderdream/comments/182643.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182643.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182643.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182643.html如果我們問那些UNIX系統(tǒng)的愛好者他們最喜歡什么,答案除了穩(wěn)定的系統(tǒng)和可以遠(yuǎn)程啟動(dòng)之外,十有八九的人會(huì)提到正則表達(dá)式;如果我們?cè)賳査麄冏铑^痛的是什么,可能除了復(fù)雜的進(jìn)程控制和安裝過程之外,還會(huì)是正則表達(dá)式。那么正則表達(dá)式到底是什么?如何才能真正的掌握正則表達(dá)式并正確的加以靈活運(yùn)用?本文將就此展開介紹,希望能夠?qū)δ切┛释私夂驼莆照齽t表達(dá)式的讀者有所助益。


入門簡(jiǎn)介

  簡(jiǎn)單的說,正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)有力的工具。我們可以在幾乎所有的基于UNIX系統(tǒng)的工具中找到正則表達(dá)式的身影,例如,vi編輯器,Perl或PHP腳本語(yǔ)言,以及awk或sed shell程序等。此外,象JavaScript這種客戶端的腳本語(yǔ)言也提供了對(duì)正則表達(dá)式的支持。由此可見,正則表達(dá)式已經(jīng)超出了某種語(yǔ)言或某個(gè)系統(tǒng)的局限,成為人們廣為接受的概念和功能。

  正則表達(dá)式可以讓用戶通過使用一系列的特殊字符構(gòu)建匹配模式,然后把匹配模式與數(shù)據(jù)文件、程序輸入以及WEB頁(yè)面的表單輸入等目標(biāo)對(duì)象進(jìn)行比較,根據(jù)比較對(duì)象中是否包含匹配模式,執(zhí)行相應(yīng)的程序。

  舉例來說,正則表達(dá)式的一個(gè)最為普遍的應(yīng)用就是用于驗(yàn)證用戶在線輸入的郵件地址的格式是否正確。如果通過正則表達(dá)式驗(yàn)證用戶郵件地址的格式正確,用戶所填寫的表單信息將會(huì)被正常處理;反之,如果用戶輸入的郵件地址與正則表達(dá)的模式不匹配,將會(huì)彈出提示信息,要求用戶重新輸入正確的郵件地址。由此可見正則表達(dá)式在WEB應(yīng)用的邏輯判斷中具有舉足輕重的作用。


基本語(yǔ)法

  在對(duì)正則表達(dá)式的功能和作用有了初步的了解之后,我們就來具體看一下正則表達(dá)式的語(yǔ)法格式。

  正則表達(dá)式的形式一般如下:

  /love/

  其中位于“/”定界符之間的部分就是將要在目標(biāo)對(duì)象中進(jìn)行匹配的模式。用戶只要把希望查找匹配對(duì)象的模式內(nèi)容放入“/”定界符之間即可。為了能夠使用戶更加靈活的定制模式內(nèi)容,正則表達(dá)式提供了專門的“元字符”。所謂元字符就是指那些在正則表達(dá)式中具有特殊意義的專用字符,可以用來規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標(biāo)對(duì)象中的出現(xiàn)模式。

  較為常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對(duì)象? 續(xù)出現(xiàn)一次或多次,“*”元字符規(guī)定其前導(dǎo)字符必須在目標(biāo)對(duì)象中出現(xiàn)零次或連續(xù)多次,而“?”元字符規(guī)定其前導(dǎo)對(duì)象必須在目標(biāo)對(duì)象中連續(xù)出現(xiàn)零次或一次。

  下面,就讓我們來看一下正則表達(dá)式元字符的具體應(yīng)用。

  /fo+/

  因?yàn)樯鲜稣齽t表達(dá)式中包含“+”元字符,表示可以與目標(biāo)對(duì)象中的 “fool”, “fo”, 或者 “football”等在字母f后面連續(xù)出現(xiàn)一個(gè)或多個(gè)字母o的字符串相匹配。

  /eg*/

  因?yàn)樯鲜稣齽t表達(dá)式中包含“*”元字符,表示可以與目標(biāo)對(duì)象中的 “easy”, “ego”, 或者 “egg”等在字母e后面連續(xù)出現(xiàn)零個(gè)或多個(gè)字母g的字符串相匹配。

  /Wil?/

  因?yàn)樯鲜稣齽t表達(dá)式中包含“?”元字符,表示可以與目標(biāo)對(duì)象中的 “Win”, 或者 “Wilson”,等在字母i后面連續(xù)出現(xiàn)零個(gè)或一個(gè)字母l的字符串相匹配。

  除了元字符之外,用戶還可以精確指定模式在匹配對(duì)象中出現(xiàn)的頻率。例如,

  /jim{2,6}/

  上述正則表達(dá)式規(guī)定字符m可以在匹配對(duì)象中連續(xù)出現(xiàn)2-6次,因此,上述正則表達(dá)式可以同jimmy或jimmmmmy等字符串相匹配。

  在對(duì)如何使用正則表達(dá)式有了初步了解之后,我們來看一下其它幾個(gè)重要的元字符的使用方式。

  \s:用于匹配單個(gè)空格符,包括tab鍵和換行符;

  \S:用于匹配除單個(gè)空格符之外的所有字符;

  \d:用于匹配從0到9的數(shù)字;

  \w:用于匹配字母,數(shù)字或下劃線字符;

  \W:用于匹配所有與\w不匹配的字符;

  . :用于匹配除換行符之外的所有字符。

 ?。ㄕf明:我們可以把\s和\S以及\w和\W看作互為逆運(yùn)算)

  下面,我們就通過實(shí)例看一下如何在正則表達(dá)式中使用上述元字符。

  /\s+/

  上述正則表達(dá)式可以用于匹配目標(biāo)對(duì)象中的一個(gè)或多個(gè)空格字符。

  /\d000/

  如果我們手中有一份復(fù)雜的財(cái)務(wù)報(bào)表,那么我們可以通過上述正則表達(dá)式輕而易舉的查找到所有總額達(dá)千元的款項(xiàng)。

  除了我們以上所介紹的元字符之外,正則表達(dá)式中還具有另外一種較為獨(dú)特的專用字符,即定位符。定位符用于規(guī)定匹配模式在目標(biāo)對(duì)象中的出現(xiàn)位置。

  較為常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)字符串的開頭,“$”定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)對(duì)象的結(jié)尾,\b定位符規(guī)定匹配模式必須出現(xiàn)在目標(biāo)字符串的開頭或結(jié)尾的兩個(gè)邊界之一,而“\B”定位符則規(guī)定匹配對(duì)象必須位于目標(biāo)字符串的開頭和結(jié)尾兩個(gè)邊界之內(nèi),即匹配對(duì)象既不能作為目標(biāo)字符串的開頭,也不能作為目標(biāo)字符串的結(jié)尾。同樣,我們也可以把“^”和“$”以及“\b”和“\B”看作是互為逆運(yùn)算的兩組定位符。舉例來說:

  /^hell/

  因?yàn)樯鲜稣齽t表達(dá)式中包含“^”定位符,所以可以與目標(biāo)對(duì)象中以 “hell”, “hello”或 “hellhound”開頭的字符串相匹配。

  /ar$/

  因?yàn)樯鲜稣齽t表達(dá)式中包含“$”定位符,所以可以與目標(biāo)對(duì)象中以 “car”, “bar”或 “ar” 結(jié)尾的字符串相匹配。

  /\bbom/

  因?yàn)樯鲜稣齽t表達(dá)式模式以“\b”定位符開頭,所以可以與目標(biāo)對(duì)象中以 “bomb”, 或 “bom”開頭的字符串相匹配。

  /man\b/

  因?yàn)樯鲜稣齽t表達(dá)式模式以“\b”定位符結(jié)尾,所以可以與目標(biāo)對(duì)象中以 “human”, “woman”或 “man”結(jié)尾的字符串相匹配。

  為了能夠方便用戶更加靈活的設(shè)定匹配模式,正則表達(dá)式允許使用者在匹配模式中指定某一個(gè)范圍而不局限于具體的字符。例如:

  /[A-Z]/

  上述正則表達(dá)式將會(huì)與從A到Z范圍內(nèi)任何一個(gè)大寫字母相匹配。

  /[a-z]/

  上述正則表達(dá)式將會(huì)與從a到z范圍內(nèi)任何一個(gè)小寫字母相匹配。

  /[0-9]/

  上述正則表達(dá)式將會(huì)與從0到9范圍內(nèi)任何一個(gè)數(shù)字相匹配。

  /([a-z][A-Z][0-9])+/

  上述正則表達(dá)式將會(huì)與任何由字母和數(shù)字組成的字符串,如 “aB0” 等相匹配。這里需要提醒用戶注意的一點(diǎn)就是可以在正則表達(dá)式中使用 “()” 把字符串組合在一起。“()”符號(hào)包含的內(nèi)容必須同時(shí)出現(xiàn)在目標(biāo)對(duì)象中。因此,上述正則表達(dá)式將無法與諸如 “abc”等的字符串匹配,因?yàn)?#8220;abc”中的最后一個(gè)字符為字母而非數(shù)字。

  如果我們希望在正則表達(dá)式中實(shí)現(xiàn)類似編程邏輯中的“或”運(yùn)算,在多個(gè)不同的模式中任選一個(gè)進(jìn)行匹配的話,可以使用管道符 “|”。例如:

  /to|too|2/

  上述正則表達(dá)式將會(huì)與目標(biāo)對(duì)象中的 “to”, “too”, 或 “2” 相匹配。

  正則表達(dá)式中還有一個(gè)較為常用的運(yùn)算符,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規(guī)定目標(biāo)對(duì)象中不能存在模式中所規(guī)定的字符串。例如:

  /[^A-C]/

  上述字符串將會(huì)與目標(biāo)對(duì)象中除A,B,和C之外的任何字符相匹配。一般來說,當(dāng)“^”出現(xiàn)在 “[]”內(nèi)時(shí)就被視做否定運(yùn)算符;而當(dāng)“^”位于“[]”之外,或沒有“[]”時(shí),則應(yīng)當(dāng)被視做定位符。

  最后,當(dāng)用戶需要在正則表達(dá)式的模式中加入元字符,并查找其匹配對(duì)象時(shí),可以使用轉(zhuǎn)義符“\”。例如:

  /Th\*/

  上述正則表達(dá)式將會(huì)與目標(biāo)對(duì)象中的“Th*”而非“The”等相匹配。


原文鏈接:http://www.yesky.com/181/51681.shtml

]]>
Java 正則表達(dá)式(一)http://www.aygfsteel.com/coderdream/archive/2008/02/28/182530.htmlCoderDreamCoderDreamThu, 28 Feb 2008 03:40:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182530.htmlhttp://www.aygfsteel.com/coderdream/comments/182530.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/28/182530.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182530.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182530.html

public String[] split(String regex)
根據(jù)給定的正則表達(dá)式的匹配來拆分此字符串。

該方法的作用就像是使用給定的表達(dá)式和限制參數(shù) 0 來調(diào)用兩參數(shù) split 方法。因此,結(jié)果數(shù)組中不包括結(jié)尾空字符串。

例如,字符串 "boo:and:foo" 產(chǎn)生帶有下面這些表達(dá)式的結(jié)果:

Regex 結(jié)果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }
參數(shù): regex - 定界正則表達(dá)式
返回: 字符串?dāng)?shù)組,根據(jù)給定正則表達(dá)式的匹配來拆分此字符串,從而生成此數(shù)組。
拋出: PatternSyntaxException - 如果正則表達(dá)式的語(yǔ)法無效

public String[] split(String regex, int limit)
根據(jù)匹配給定的正則表達(dá)式來拆分此字符串。

此方法返回的數(shù)組包含此字符串的每個(gè)子字符串,這些子字符串由另一個(gè)匹配給定的表達(dá)式的子字符串終止或由字符串結(jié)束來終止。數(shù)組中的子字符串按它們?cè)诖俗址械捻樞蚺帕小H绻磉_(dá)式不匹配輸入的任何部分,則結(jié)果數(shù)組只具有一個(gè)元素,即此字符串。

limit 參數(shù)控制模式應(yīng)用的次數(shù),因此影響結(jié)果數(shù)組的長(zhǎng)度。如果該限制 n 大于 0,則模式將被最多應(yīng)用 n - 1 次,數(shù)組的長(zhǎng)度將不會(huì)大于 n,而且數(shù)組的最后項(xiàng)將包含超出最后匹配的定界符的所有輸入。如果 n 為非正,則模式將被應(yīng)用盡可能多的次數(shù),而且數(shù)組可以是任意長(zhǎng)度。如果 n 為零,則模式將被應(yīng)用盡可能多的次數(shù),數(shù)組可有任何長(zhǎng)度,并且結(jié)尾空字符串將被丟棄。

例如,字符串 "boo:and:foo" 使用這些參數(shù)可生成下列結(jié)果:

Regex Limit 結(jié)果
: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

這種形式的方法調(diào)用 str.split(regex, n) 產(chǎn)生與以下表達(dá)式完全相同的結(jié)果:

Pattern.compile(regex).split(str, n)

參數(shù): regex - 定界正則表達(dá)式 ;limit - 結(jié)果閾值,如上所述

返回: 字符串?dāng)?shù)組,根據(jù)給定正則表達(dá)式的匹配來拆分此字符串,從而生成此數(shù)組

public String replaceAll(String regex, String replacement)
使用給定的 replacement 字符串替換此字符串匹配給定的正則表達(dá)式的每個(gè)子字符串。

此方法調(diào)用的 str.replaceAll(regex, repl) 形式產(chǎn)生與以下表達(dá)式完全相同的結(jié)果:

Pattern.compile(regex).matcher(str).replaceAll(repl)

參數(shù): regex - 用來匹配此字符串的正則表達(dá)式

返回: 得到的 String

public String replaceFirst(String regex, String replacement)
使用給定的 replacement 字符串替換此字符串匹配給定的正則表達(dá)式的第一個(gè)子字符串。

此方法調(diào)用的 str.replaceFirst(regex, repl) 形式產(chǎn)生與以下表達(dá)式完全相同的結(jié)果:

Pattern.compile(regex).matcher(str).replaceFirst(repl)

參數(shù):regex - 用來匹配此字符串的正則表達(dá)式

返回: 得到的 String

這四個(gè)方法中都有一個(gè)參數(shù)為正則表達(dá)式(Regular Expression),而不是普通的字符串。

在正則表達(dá)式中具有特殊含義的字符

特殊字符

描述

    .     表示任意一個(gè)字符
    [abc]     表示a、b或c中的任意一個(gè)字符
    [^abc]     除a、b和c以外的任意一個(gè)字符
    [a-zA-z]     介于a到z,或A到Z中的任意一個(gè)字符
    \s     空白符(空格、tab、換行、換頁(yè)、回車)
    \S     非空白符
    \d     任意一個(gè)數(shù)字[0-9]
    \D     任意一個(gè)非數(shù)字[^0-9]
    \w     詞字符[a-zA-Z_0-9]
    \W     非詞字符

表示字符出現(xiàn)次數(shù)的符號(hào)

表示次數(shù)的符號(hào)

描述

    *     0 次或者多次
    +     1 次或者多次
    ?     0 次或者 1 次
    {n}     恰好 n 次
    {n, m}     至少 n 次,不多于 m 次


public class RegDemo2 {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// 例如,字符串 "boo:and:foo" 產(chǎn)生帶有下面這些表達(dá)式的結(jié)果: Regex 結(jié)果
        
// : { "boo", "and", "foo" }
        
// o { "b", "", ":and:f" }
        String tempStr = "boo:and:foo";
        String[] a 
= tempStr.split(":");        
        pringStringArray(a);
        
        String[] b 
= tempStr.split("o");
        pringStringArray(b);
        
        System.out.println(
"--------------------------");
        
        
// Regex Limit 結(jié)果
        
// : 2 { "boo", "and:foo" }
        
// : 5 { "boo", "and", "foo" }
        
// : -2 { "boo", "and", "foo" }
        
// o 5 { "b", "", ":and:f", "", "" }
        
// o -2 { "b", "", ":and:f", "", "" }
        
// o 0 { "b", "", ":and:f" }
        pringStringArray(tempStr.split(":"2));
        pringStringArray(tempStr.split(
":"5));
        pringStringArray(tempStr.split(
":"-2));
        pringStringArray(tempStr.split(
"o"5));
        pringStringArray(tempStr.split(
"o"-2));
        pringStringArray(tempStr.split(
"o"0));

        
// 字符串 "boo:and:foo"中的所有“:”都被替換為“XX”,輸出:booXXandXXfoo
        System.out.println(tempStr.replaceAll(":""XX"));
        
        
// 字符串 "boo:and:foo"中的第一個(gè)“:”都被替換為“XX”,輸出: booXXand:foo
        System.out.println(tempStr.replaceFirst(":""XX"));
    }

    
public static void pringStringArray(String[] s) {
        
int index = s.length;
        
for (int i = 0; i < index; i++) {
            System.err.println(i 
+ "" + s[i]);
        }
    }
}

下面的程序演示了正則表達(dá)式的用法:
/**
 * discription:
 * 
 * 
@author CoderDream
 * 
 
*/
public class RegularExTester {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// 把字符串中的“aaa”全部替換為“z”,打?。簔bzcz
        System.out.println("aaabaaacaaa".replaceAll("a{3}""z"));

        
// 把字符串中的“aaa”、“aa”或者“a”全部替換為“*”,打印:*b*c*
        System.out.println("aaabaaca".replaceAll("a{1,3}""\\*"));

        
// 把字符串中的數(shù)字全部替換為“z”,打?。簔zzazzbzzcc
        System.out.println("123a44b35cc".replaceAll("\\d""z"));

        
// 把字符串中的非數(shù)字全部替換為“0”,打印:1234000435000
        System.out.println("1234abc435def".replaceAll("\\D""0"));

        
// 把字符串中的“.”全部替換為“\”,打?。篶om\abc\dollapp\Doll
        System.out.println("com.abc.dollapp.Doll".replaceAll("\\.""\\\\"));

        
// 把字符串中的“a.b”全部替換為“_”,
        
// “a.b”表示長(zhǎng)度為3的字符串,以“a”開頭,以“b”結(jié)尾
        
// 打?。?hello-all
        System.out.println("azbhelloahball".replaceAll("a.b""-"));

        
// 把字符串中的所有詞字符替換為“#”
        
// 正則表達(dá)式“[a-zA-z_0-9]”等價(jià)于“\w”
        
// 打印:#.#.#.#.#.#
        System.out.println("a.b.c.1.2.3.4".replaceAll("[a-zA-z_0-9]""#"));
        System.out.println(
"a.b.c.1.2.3.4".replaceAll("\\w""#"));
    }
}

值得注意的是,由于“.”、“?”和“*”等在正則表達(dá)式中具有特殊的含義,如果要表示字面上的這些字符,必須以“\\”開頭。例如為了把字符串“com.abc.dollapp.Doll”中的“.”替換為“\”,應(yīng)該調(diào)用replaceAll("\\.",\\\\)方法。

Java中的正則表達(dá)式類


 public interface MatchResult


    

匹配操作的結(jié)果。

此接口包含用于確定與正則表達(dá)式匹配結(jié)果的查詢方法。通過 MatchResult 可以查看匹配邊界、組和組邊界,但是不能修改


 public final class Matcher

extends Object
implements MatchResult

    

通過解釋 Pattern 對(duì) 字符序列 執(zhí)行匹配操作的引擎。

通過調(diào)用模式的 matcher 方法從模式創(chuàng)建匹配器。創(chuàng)建匹配器后,可以使用它執(zhí)行三種不同的匹配操作:

  • matches 方法嘗試將整個(gè)輸入序列與該模式匹配。

  • lookingAt 嘗試將輸入序列從頭開始與該模式匹配。

  • find 方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列。

每個(gè)方法都返回一個(gè)表示成功或失敗的布爾值。通過查詢匹配器的狀態(tài)可以獲取關(guān)于成功匹配的更多信息。


 public final class Pattern

extends Object
implements Serializable

    

正則表達(dá)式的編譯表示形式。

指定為字符串的正則表達(dá)式必須首先被編譯為此類的實(shí)例。然后,可將得到的模式用于創(chuàng)建 Matcher 對(duì)象,依照正則表達(dá)式,該對(duì)象可以與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個(gè)匹配器可以共享同一模式。

因此,典型的調(diào)用順序是

 Pattern p = Pattern.matches();

在僅使用一次正則表達(dá)式時(shí),可以方便地通過此類定義 matches 方法。此方法編譯表達(dá)式并在單個(gè)調(diào)用中將輸入序列與其匹配。語(yǔ)句

 boolean b = Pattern.matches("a*b", "aaaaab");

等效于上面的三個(gè)語(yǔ)句,盡管對(duì)于重復(fù)的匹配而言它效率不高,因?yàn)樗辉试S重用已編譯的模式。

此類的實(shí)例是不可變的,可供多個(gè)并發(fā)線程安全使用。Matcher 類的實(shí)例用于此目的則不安全。


測(cè)試代碼:

/**
 * discription:Java中正則表達(dá)式類的使用
 * 
 * 
@author CoderDream
 * 
 
*/
public class RegDemo {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// 檢查字符串中是否含有“aaa”,有返回:true,無返回:false
        System.out.println(isHaveBeenSetting("a{3}""aaabaaacaaa"));
        System.out.println(isHaveBeenSetting(
"a{3}""aab"));
        
        
// 把字符串“abbaaacbaaaab”中的“aaa”全部替換為“z”,打印:abbzbza
        System.out.println(replaceStr("a{3}""abbaaabaaaa""z"));
    }

    
/**
     * 
     * 
@param regEx
     *            設(shè)定的正則表達(dá)式
     * 
@param tempStr
     *            系統(tǒng)參數(shù)中的設(shè)定的字符串
     * 
@return 是否系統(tǒng)參數(shù)中的設(shè)定的字符串含有設(shè)定的正則表達(dá)式 如果有的則返回true
     
*/
    
public static boolean isHaveBeenSetting(String regEx, String tempStr) {
        
boolean result = false;
        
try {
            Pattern p 
= Pattern.compile(regEx);
            Matcher m 
= p.matcher(tempStr);
            result 
= m.find();
        } 
catch (Exception e) {
            e.printStackTrace();
        }
        
return result;
    }

    
/**
     * 將字符串含有的regEx表達(dá)式替換為replaceRegEx
     * 
     * 
@param regEx
     *            需要被替換的正則表達(dá)式
     * 
@param tempStr
     *            替換的字符串
     * 
@param replaceRegEx
     *            替換的正則表達(dá)式
     * 
@return 替換好后的字符串
     
*/
    
public static String replaceStr(String regEx, String tempStr,
            String replaceRegEx) {
        Pattern p 
= Pattern.compile(regEx);
        Matcher m 
= p.matcher(tempStr);
        tempStr 
= m.replaceAll(replaceRegEx);

        
return tempStr;
    }
}


]]>
Practical Java 學(xué)習(xí)筆記-- 1 一般技術(shù)(General Techniques)http://www.aygfsteel.com/coderdream/archive/2008/02/26/182267.htmlCoderDreamCoderDreamTue, 26 Feb 2008 09:56:00 GMThttp://www.aygfsteel.com/coderdream/archive/2008/02/26/182267.htmlhttp://www.aygfsteel.com/coderdream/comments/182267.htmlhttp://www.aygfsteel.com/coderdream/archive/2008/02/26/182267.html#Feedback0http://www.aygfsteel.com/coderdream/comments/commentRss/182267.htmlhttp://www.aygfsteel.com/coderdream/services/trackbacks/182267.html實(shí)踐1:參數(shù)以by value方式而非by reference方式傳遞
實(shí)踐2:對(duì)不變的data和object reference使用final
實(shí)踐3:缺省情況下所有non-static函數(shù)都可被重寫
實(shí)踐4:在array和Vectors之間慎重選擇
實(shí)踐5:多態(tài)(polymorphism)優(yōu)于instanceof
實(shí)踐6:必要時(shí)才使用instanceof
實(shí)踐7:一旦不需要object reference,就將它設(shè)為null

實(shí)踐1:參數(shù)以by value方式而非by reference方式傳遞

import java.awt.Point;

class PassByValue {
    
public static void modifyPoint(Point pt, int j) {
        pt.setLocation(
55); // 1
        j = 15;
        System.out.println(
"During modifyPoint " + "pt = " + pt + " and j = " + j);
    }

    
public static void main(String args[]) {
        Point p 
= new Point(00); // 2
        int i = 10;
        System.out.println(
"Before modifyPoint " + "p  = " + p + " and i = " + i);
        modifyPoint(p, i); 
// 3
        System.out.println("After  modifyPoint " + "p  = " + p + " and i = " + i);
    }
}
這段代碼在//2處建立了一個(gè)Point對(duì)象并設(shè)初值為(0,0),接著將其值賦予object reference 變量p。然后對(duì)基本類型int i賦值10。//3調(diào)用static modifyPoint(),傳入p和i。modifyPoint()對(duì)第一個(gè)參數(shù)pt調(diào)用了setLocation(),將其左邊改為(5,5)。然后將第二個(gè)參數(shù)j賦值為15.當(dāng)modifyPoint()返回的時(shí)候,main()打印出p和i的值。

程序輸出如下:
Before modifyPoint p  = java.awt.Point[x=0,y=0] and i = 10
During modifyPoint pt 
= java.awt.Point[x=5,y=5] and j = 15
After   modifyPoint p  
= java.awt.Point[x=5,y=5] and i = 10

這顯示modifyPoint()改變了//2 所建立的Point對(duì)象,卻沒有改變int i。在main()之中,i被賦值10.由于參數(shù)通過by value方式傳遞,所以modifyPoint()收到i的一個(gè)副本,然后它將這個(gè)副本改為15并返回。main()內(nèi)的原值i并沒有受到影響。

對(duì)比之下,事實(shí)上modifyPoint() 是在與“Point 對(duì)象的 reference 的復(fù)件”打交道,而不是與“Point對(duì)象的復(fù)件”打交道。當(dāng)p從main()被傳入modifyPoint()時(shí),傳遞的是p(也就是一個(gè)reference)的復(fù)件。所以modifyPoint()是在與同一個(gè)對(duì)象打交道,只不過通過別名pt罷了。在進(jìn)入modifyPoint()之后和執(zhí)行 //1 之前,這個(gè)對(duì)象看起來是這樣:

所以//1 執(zhí)行以后,這個(gè)Point對(duì)象已經(jīng)改變?yōu)?5,5)。

實(shí)踐2:對(duì)不變的data和object reference使用final

Java 關(guān)鍵字 final 用來表示常量數(shù)據(jù)。例如:

public class Test {
    
static final int someInt = 10;
    
// 
}

這段代碼聲明了一個(gè) static 類變量,命名為 someInt,并設(shè)其初值為10。
任何試圖修改 someInt 的代碼都將無法通過編譯。例如:

    // 
    someInt = 9// Error
    
// 

關(guān)鍵字 final 可防止 classes 內(nèi)的 instance 數(shù)據(jù)遭到無意間的修改。如果我們想要一個(gè)常量對(duì)象,又該如何呢?例如:

class Circle {
    
private double rad;

    
public Circle(double r) {
        rad 
= r;
    }

    
public void setRadius(double r) {
        rad 
= r;
    }

    
public double radius() {
        
return rad;
    }
}

public class FinalTest {
    
private static final Circle wheel = new Circle(5.0);

    
public static void main(String args[]) {
        System.out.println(
"Radius of wheel is " + wheel.radius());
        wheel.setRadius(
7.4);
        System.out.println(
"Radius of wheel is now " + wheel.radius());
    }
}

這段代碼的輸出是:

Radius of wheel is 5.0
Radius of wheel is now 
7.4

在上述第一個(gè)示例中,我們企圖改變final 數(shù)據(jù)值時(shí),編譯器會(huì)偵測(cè)出錯(cuò)誤。
在第二個(gè)示例中,雖然代碼改變了 instance變量wheel的值,編譯器還是讓它通過了。我們已經(jīng)明確聲明wheel為final,它怎么還能被改變呢?
不,我們確實(shí)沒有改變 wheel 的值,我們改變的是wheel 所指對(duì)象的值。wheel 并無變化,仍然指向(代表)同一個(gè)對(duì)象。變量wheel是一個(gè) object reference,它指向?qū)ο笏诘膆eap位置。有鑒如此,下面的代碼會(huì)怎樣?

public class FinalTest {
    
private static final Circle wheel = new Circle(5.0);

    
public static void main(String args[]) {
        System.out.println(
"Radius of wheel is " + wheel.radius());
        wheel 
= new Circle(7.4); // 1
        System.out.println(
"Radius of wheel is now " + wheel.radius());
    }
}

編譯代碼,// 1 處出錯(cuò)。由于我們企圖改變 final 型變量 wheel 的值,所以這個(gè)示例將產(chǎn)生編譯錯(cuò)誤。換言之,代碼企圖令wheel指向其他對(duì)象。變量wheel是final,因此也是不可變的。它必須永遠(yuǎn)指向同一個(gè)對(duì)象。然而wheel所指向的對(duì)象并不受關(guān)鍵字final的影響,因此是可變的。

關(guān)鍵字 final 只能防止變量值的改變。如果被聲明為 final 的變量是個(gè) object reference,那么該reference不能被改變,必須永遠(yuǎn)指向同一個(gè)對(duì)象,但被指的那個(gè)對(duì)象可以隨意改變內(nèi)部的屬性值。

實(shí)踐3:缺省情況下所有non-static函數(shù)都可以被覆蓋重寫

關(guān)鍵字final 在Java中有多重用途,即可被用于instance變量、static變量,也可用于classes或methods,用于類,表示該類不能有子類;用于方法,表示該方法不允許被子類覆蓋。

實(shí)踐4:在array和vectors之間慎重選擇

array和Vector的比較

 

支持基本類型

支持對(duì)象

自動(dòng)改變大小

速度快

array

Yes

Yes

No

Yes

Vector

No(1.5以上支持)

Yes

Yes

No

實(shí)踐5:多態(tài)(polymorphism)優(yōu)于instanceof

代碼1:instanceof方式

interface Employee {
    
public int salary();
}

class Manager implements Employee {
    
private static final int mgrSal = 40000;

    
public int salary() {
        
return mgrSal;
    }
}

class Programmer implements Employee {
    
private static final int prgSal = 50000;
    
private static final int prgBonus = 10000;

    
public int salary() {
        
return prgSal;
    }

    
public int bonus() {
        
return prgBonus;
    }
}

class Payroll {
    
public int calcPayroll(Employee emp) {
        
int money = emp.salary();
        
if (emp instanceof Programmer)
            money 
+= ((Programmer) emp).bonus(); // Calculate the bonus
        return money;
    }

    
public static void main(String args[]) {
        Payroll pr 
= new Payroll();
        Programmer prg 
= new Programmer();
        Manager mgr 
= new Manager();
        System.out.println(
"Payroll for Programmer is " + pr.calcPayroll(prg));
        System.out.println(
"payroll for Manager is " + pr.calcPayroll(mgr));
    }
}
依據(jù)這個(gè)設(shè)計(jì),calcPayroll()必須使用instanceof操作符才能計(jì)算出正確結(jié)果。因?yàn)樗褂昧薊mployee接口,所以它必須斷定Employee對(duì)象究竟實(shí)際屬于哪個(gè)class。程序員有獎(jiǎng)金而經(jīng)理沒有,所以你必須確定Employee對(duì)象的運(yùn)行時(shí)類型。

代碼2:多態(tài)方式
interface Employee {
    
public int salary();

    
public int bonus();
}

class Manager implements Employee {
    
private static final int mgrSal = 40000;
    
private static final int mgrBonus = 0;

    
public int salary() {
        
return mgrSal;
    }

    
public int bonus() {
        
return mgrBonus;
    }
}

class Programmer implements Employee {
    
private static final int prgSal = 50000;
    
private static final int prgBonus = 10000;

    
public int salary() {
        
return prgSal;
    }

    
public int bonus() {
        
return prgBonus;
    }
}

class Payroll {
    
public int calcPayroll(Employee emp) {
        
// Calculate the bonus. No instanceof check needed.
        return emp.salary() + emp.bonus();
    }

    
public static void main(String args[]) {
        Payroll pr 
= new Payroll();
        Programmer prg 
= new Programmer();
        Manager mgr 
= new Manager();
        System.out.println(
"Payroll for Programmer is " + pr.calcPayroll(prg));
        System.out.println(
"Payroll for Manager is " + pr.calcPayroll(mgr));
    }
}
在這個(gè)設(shè)計(jì)中,我們?yōu)镋mployee接口增加了 bonus(),從而消除了instanceof的必要性。實(shí)現(xiàn)Employee接口的兩個(gè) classes:Programmer和Manager,都必須實(shí)現(xiàn)salary()和bonus()。這些修改顯著簡(jiǎn)化了calcPayroll()。


實(shí)踐6:必要時(shí)才使用instanceof

import java.util.Vector;

class Shape {
}

class Circle extends Shape {
    
public double radius() {
        
return 5.7;
    }
    
// 
}

class Triangle extends Shape {
    
public boolean isRightTriangle() {
        
// Code to determine if triangle is right
        return true;
    }
    
// 
}

class StoreShapes {
    
public static void main(String args[]) {
        Vector shapeVector 
= new Vector(10);
        shapeVector.add(
new Triangle());
        shapeVector.add(
new Triangle());
        shapeVector.add(
new Circle());
        
// 
        
// Assume many Triangles and Circles are added and removed
        
// 
        int size = shapeVector.size();
        
for (int i = 0; i < size; i++) {
            Object o 
= shapeVector.get(i);
            
if (o instanceof Triangle) {
                
if (((Triangle) o).isRightTriangle()) {
                    
// 
                }
            } 
else if (o instanceof Circle) {
                
double rad = ((Circle) o).radius();
                
// 
            }
        }
    }
}
這段代碼表明在 這種場(chǎng)合下 instanceof 操作符是必需的。當(dāng)程序從Vector 取回對(duì)象,它們屬于java.lang.Object。利用instanceof確定對(duì)象實(shí)際屬于哪個(gè)class后,我們才能正確執(zhí)行向下轉(zhuǎn)型,而不至于在運(yùn)行期拋出異常。

實(shí)踐7:一旦不再需要object reference,就將它設(shè)為null



]]>
主站蜘蛛池模板: 莱阳市| 鹤峰县| 中牟县| 东丰县| 克拉玛依市| 新和县| 巴彦淖尔市| 竹溪县| 方正县| 汤原县| 沙湾县| 东兴市| 林甸县| 山阳县| 高邮市| 巴楚县| 太湖县| 类乌齐县| 长泰县| 九龙城区| 贵溪市| 奎屯市| 抚远县| 清远市| 大理市| 新绛县| 侯马市| 浦北县| 钦州市| 元谋县| 淳化县| 文化| 吉木萨尔县| 兰西县| 宁海县| 游戏| 噶尔县| 大渡口区| 余干县| 河津市| 申扎县|