置頂隨筆
2006年11月16日
上網(wǎng)找尋了一些資料如下:
?匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正則表達(dá)式:\n[\s| ]*\r
匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)
應(yīng)用:javascript中沒(méi)有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來(lái)實(shí)現(xiàn),如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:
下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值的Javascript程序:
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達(dá)式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不過(guò)上面的程序如果不用正則表達(dá)式,而直接用split函數(shù)來(lái)分解可能更簡(jiǎn)單,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網(wǎng)址URL的正則表達(dá)式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:[注:此程序不正確,原因見(jiàn)本貼回復(fù)]
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //結(jié)果為:abcefgi
我原來(lái)在CSDN上發(fā)貼尋求一個(gè)表達(dá)式來(lái)實(shí)現(xiàn)去除重復(fù)字符的方法,最終沒(méi)有找到,這是我能想到的最簡(jiǎn)單的實(shí)現(xiàn)方法。思路是使用后向引用取出包括重復(fù)的字符,再以重復(fù)的字符建立第二個(gè)表達(dá)式,取到不重復(fù)的字符,兩者串連。這個(gè)方法對(duì)于字符順序有要求的字符串可能不適用。
得用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正則表達(dá)式限制網(wǎng)頁(yè)表單里的文本框輸入內(nèi)容:
用正則表達(dá)式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正則表達(dá)式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
同時(shí)找到一個(gè)可以測(cè)試正則表達(dá)式的正確性的小軟件,很不錯(cuò),居然可以語(yǔ)法高亮。不過(guò)說(shuō)實(shí)話正則表達(dá)式寫出來(lái)亂七八糟的,就算有分色顯示看起來(lái)也好不到哪里去。。。。。。
MTracer 下載
2006年11月2日
前提是該范型中包含的對(duì)象Object已經(jīng)實(shí)現(xiàn)了Collections.sort()要求的接口:
public int compareTo(Object o)
這個(gè)compareTo的方法應(yīng)當(dāng)直接的表現(xiàn)出你想要以O(shè)bject的哪個(gè)字段進(jìn)行排序
我們可以這樣寫:
public int compareTo(Object o) {
??????? DbPoJo po = null;
??????? if(o instanceof DbPoJo)
??????????? po = (DbPoJo)o;
??????? return po.getId().compareTo(this.getId());
}
假設(shè)我們的List中包含的每個(gè)元素都是 DbPoJo 這個(gè)對(duì)象,在這里需要先將Object強(qiáng)制轉(zhuǎn)換為DbPoJo
然后就可以利用String的compareTo()方法來(lái)進(jìn)行返回
最后,對(duì)我們的List :List<DbPoJo> returnList = new ArrayList<DbPoJo>();
通過(guò)調(diào)用Collections的靜態(tài)方法 sort() 進(jìn)行排序:
Collections.sort(returnList);
通過(guò)上例,可以看出一個(gè)類一旦實(shí)現(xiàn)Comparable接口,那么它就可以跟很多依賴于該接口的集合進(jìn)行協(xié)作。
用《Effective JAVA 》的話來(lái)說(shuō):你可以以很小的努力,來(lái)獲得非常強(qiáng)大的功能
2006年10月25日
有狀態(tài)和無(wú)狀態(tài)的會(huì)話bean。
·@PreDestroy:使用這個(gè)注釋的方法會(huì)在容器從它的對(duì)象池中銷毀一個(gè)無(wú)用的或者過(guò)期的bean 實(shí)例之前調(diào)
用。這個(gè)注釋同時(shí)適用于有狀態(tài)和無(wú)狀態(tài)的會(huì)話bean。
·@PrePassivate:當(dāng)一個(gè)有狀態(tài)的session bean實(shí)例空閑過(guò)長(zhǎng)的時(shí)間,容器將會(huì)鈍化(passivate)它,并把它的
狀態(tài)保存在緩存當(dāng)中。使用這個(gè)注釋的方法會(huì)在容器鈍化bean實(shí)例之前調(diào)用。這個(gè)注釋適用于有狀態(tài)的會(huì)話bean。
當(dāng)鈍化后,又經(jīng)過(guò)一段時(shí)間該bean 仍然沒(méi)有被操作,容器將會(huì)把它從存儲(chǔ)介質(zhì)中刪除。以后,任何針對(duì)該bean
方法的調(diào)用容器都會(huì)拋出例外。
·@PostActivate:當(dāng)客戶端再次使用已經(jīng)被鈍化的有狀態(tài)session bean時(shí),新的實(shí)例被創(chuàng)建,狀態(tài)被恢復(fù)。
使用此注釋的session bean會(huì)在bean的激活完成時(shí)調(diào)用。這個(gè)注釋只適用于有狀態(tài)的會(huì)話bean。
·@Init:這個(gè)注釋指定了有狀態(tài)session bean初始化的方法。它區(qū)別于@PostConstruct注釋在于:多個(gè)@Init
注釋方法可以同時(shí)存在于有狀態(tài)session bean 中,但每個(gè)bean實(shí)例只會(huì)有一個(gè)@Init注釋的方法會(huì)被調(diào)用。這取
決于bean是如何創(chuàng)建的(細(xì)節(jié)請(qǐng)看EJB 3.0規(guī)范)。@PostConstruct在@Init之后被調(diào)用。
另一個(gè)有用的生命周期方法注釋是@Remove,特別是對(duì)于有狀態(tài)session bean。當(dāng)應(yīng)用通過(guò)存根對(duì)象調(diào)用使用了
@Remove注釋的方法時(shí),容器就知道在該方法執(zhí)行完畢后,要把bean實(shí)例從對(duì)象池中移走。
我寫了一個(gè)statful Session bean.需要等待9分鐘左右,容器才會(huì)鈍化此會(huì)話Bean。。。。。
然后經(jīng)證明,statfulBean的鈍化時(shí)間是10分鐘,完全銷毀差不多要15分鐘。。。Jboss是個(gè)愚蠢的東西
還沒(méi)有找到相應(yīng)的文檔說(shuō)明這一問(wèn)題的,因?yàn)殁g化后GC不會(huì)馬上來(lái)收,這就導(dǎo)致可能會(huì)有潛在的內(nèi)存泄露問(wèn)題了。
我只用到JBoss,不知道有沒(méi)有用Weblogic的朋友是不是也有同樣的問(wèn)題?
2006年10月24日
不過(guò)我覺(jué)得可能是Collection的范型支持先出現(xiàn),然后才引入了這種迭代結(jié)構(gòu)
可變參數(shù)倒是比其中一個(gè)較好玩的東西:



?2




?3


?4

?5

?6

?7

?8



?9

10

11

12



13

14

15

像上面的這樣,可變參數(shù)就是在普通的參數(shù)后面加上三個(gè)"."。
我沒(méi)有發(fā)現(xiàn)可變參數(shù)有什么太大的用處,在J2EE的框架開(kāi)發(fā)中幾乎用不到,不過(guò)當(dāng)有時(shí)候我們不確定參數(shù)到底有幾個(gè)時(shí)倒是可以用這種方式來(lái)代替以往傳遞一個(gè)數(shù)組的方式。
可變參數(shù)同時(shí)可以跟固定的參數(shù)混合使用。
但同時(shí)可變參數(shù)有一些限制:一個(gè)方法的參數(shù)中不能同時(shí)擁有2種類型的可變參數(shù),也就是說(shuō):
public void foo(String ... str,Integer ... i)這樣是不行的