??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲黄黄黄网站在线观看,亚洲国产精品无码久久一区二区,亚洲成av人片不卡无码久久http://www.tkk7.com/jackylpz/category/9639.html目标 --> 每天都要象过q一PQ!zh-cnFri, 02 Mar 2007 03:09:49 GMTFri, 02 Mar 2007 03:09:49 GMT60java 代码查询|站 http://www.tkk7.com/jackylpz/archive/2006/04/26/43283.htmlq年q年Wed, 26 Apr 2006 06:38:00 GMThttp://www.tkk7.com/jackylpz/archive/2006/04/26/43283.htmlhttp://www.tkk7.com/jackylpz/comments/43283.htmlhttp://www.tkk7.com/jackylpz/archive/2006/04/26/43283.html#Feedback0http://www.tkk7.com/jackylpz/comments/commentRss/43283.htmlhttp://www.tkk7.com/jackylpz/services/trackbacks/43283.htmljava 代码查询|站 1. java2s  http://www.java2s.com/
   q个|站非常好,分成三大c,分别?font color="#003399" size="2">Example?font size="2">Products?/font>ArticlesQ每个大cM又分别设许多类Q还有搜索功能,q样查找h非常方便。。比如,如果要学习SWT/JFaceQ只要把Example下的SWT JFace Eclipse研究一下也可以了。另外,q个|站q有JavaScript DHTML?C# / C Sharp?C / ANSI-C?SQL / MySQL{类。MQ非常好?br />
  2. codeZoo http://www.codezoo.com/
   q是O'Reily旗下的,除了Java之外Q还有Ruby、Python?/div>
 
  3. Java学习源代码检索系l?nbsp; http://www.chinaitlab.com/www/school/codesearch/index.html
   隑־看见国的,好歹也要支持一下,分类也算清楚?/div>
 
  4. Koders  http://www.koders.com/
   是个l合查询的网站,不过它好像是从代码中查找关键词,包含的语a挺多的?/div>
 
  5. Resources for Java server-side developers  http://www.java201.com/
   切的说Q它是一个资源收集的|站Q代码查询ƈ不多。不q它分类相当l,如Articles、Books、Examples、Extensions、Frameworks{类Q你可以输入Spring或Hibernate作ؓ关键词搜索一下看看?br />  6. http://www.codase.com


q年 2006-04-26 14:38 发表评论
]]>Java正则表达式技巧ȝhttp://www.tkk7.com/jackylpz/archive/2006/04/24/42851.htmlq年q年Mon, 24 Apr 2006 08:45:00 GMThttp://www.tkk7.com/jackylpz/archive/2006/04/24/42851.htmlhttp://www.tkk7.com/jackylpz/comments/42851.htmlhttp://www.tkk7.com/jackylpz/archive/2006/04/24/42851.html#Feedback0http://www.tkk7.com/jackylpz/comments/commentRss/42851.htmlhttp://www.tkk7.com/jackylpz/services/trackbacks/42851.html匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]
匚w双字节字W?包括汉字在内)Q[^\x00-\xff]
应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?br />String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匚wI的正则表辑ּQ\n[\s| ]*\r

匚wHTML标记的正则表辑ּQ?<(.*)>.*<\/\1>|<(.*) \/>/

匚w首尾I格的正则表辑ּQ?^\s*)|(\s*$)

应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现Q如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址Q?br />下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的JavascriptE序Q?br />function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匚wIP地址的正则表辑ּ
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!")
}
}

不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?br />var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是Q?quot;+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匚w|址URL的正则表辑ּQhttp://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
我原来在CSDN上发贴寻求一个表辑ּ来实现去除重复字W的ҎQ最l没有找刎ͼq是我能惛_的最单的实现Ҏ。思\是用后向引用取出包括重复的字符Q再以重复的字符建立W二个表辑ּQ取C重复的字W,两者串q。这个方法对于字W顺序有要求的字W串可能不适用?br />得用正则表达式从URL地址中提取文件名的javascriptE序Q如下结果ؓpage1
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正则表达式限制网表单里的文本框输入内容Q?br />用正则表辑ּ限制只能输入中文Qonkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,&#39;&#39;)" onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\u4E00-\u9FA5]/g,&#39;&#39;))"
用正则表辑ּ限制只能输入全角字符Q?onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,&#39;&#39;)" onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\uFF00-\uFFFF]/g,&#39;&#39;))"
用正则表辑ּ限制只能输入数字Qonkeyup="value=value.replace(/[^\d]/g,&#39;&#39;) "onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\d]/g,&#39;&#39;))"
用正则表辑ּ限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,&#39;&#39;) "onbeforepaste="clipboardData.setData(&#39;text&#39;,clipboardData.getData(&#39;text&#39;).replace(/[^\d]/g,&#39;&#39;))"


q年 2006-04-24 16:45 发表评论
]]>
破译天书Q正则表辑ּ学习心得体会http://www.tkk7.com/jackylpz/archive/2006/04/24/42846.htmlq年q年Mon, 24 Apr 2006 08:36:00 GMThttp://www.tkk7.com/jackylpz/archive/2006/04/24/42846.htmlhttp://www.tkk7.com/jackylpz/comments/42846.htmlhttp://www.tkk7.com/jackylpz/archive/2006/04/24/42846.html#Feedback0http://www.tkk7.com/jackylpz/comments/commentRss/42846.htmlhttp://www.tkk7.com/jackylpz/services/trackbacks/42846.html前言

  Regular Expressions(正则表达式,以下用REU呼)对小弟来说一直都是神密的地带Q看C些网l上的大大,单用RE决解了某些文字的问题,弟便兴起了学一学RE的想法,但小弟天生就比较懒一些,d望看有没有些快速学习的方式Q于是小弟又请出Google大神Q藉q的神力,弟在网l上扑ֈ了Jim Hollenhorst先生的文章,l过了阅读,弟觉得真是不错Q所以就做个心得报告,跟Move-to.Net的朋友分享,希望能ؓ各位大大带来一丁点在学习RE时的帮助。Jim Hollenhorst大大文章之网址如下Q有需要的大大可直接连l?/p>

[Blocked Ads]  The 30 Minute Regex Tutorial By Jim Hollenhorst

  http://www.codeproject.com/useritems/RegexTutorial.asp

  什么是RE?

  惛_各位大大在做文g查找的时侯都有用过万用字符”*”Q比如说x扑֜Windows目录下所有的Word文gӞ你可能就会用”*.doc”q样的方式来做查找,因ؓ”*”所代表的是L的字W。RE所做的是cMq样的功能,但其功能更ؓ强大?/p>

  写程序时Q常需要比对字W串是否W合特定样式QRE最主要的功能就是来描述q特定的样式Q因此可以将RE视ؓ特定样式的描q式QD个例子来_”\w+”所代表的就是Q何字母与数字所l成的非I字W串(non-null string)。在.NET framework中提供了非常强大的类别库Q藉此可以很L的用RE来做文字的查找与取代、对复杂标头的译码及验证文字{工作?/p>

  学习RE最好的方式是藉由例子亲自来做做看。Jim Hollenhorst大大也提供了一个工L序Expresso(来杯咖啡?Q来帮助我们学习REQ下载的|址?a >http://www.codeproject.com/useritems/RegexTutorial/ExpressoSetup2_1C.zip?/p>

  接下来,p我们来体验一些例子吧?/p>

  一些简单的例子

  假设要查找文章中Elvis后接有alive的文字符串的话,使用RE可能会经q下列的q程Q括h所下RE的意思:

  1. elvis (查找elvis)

  上述代表所要查扄字符序为elvis。在.NET中可以设定乎略字W的大小写,所?rdquo;Elvis”?rdquo;ELVIS”或者是”eLvIs”都是W合1所下的RE。但因ؓq只字W出现的序为elvisQ所以pelvis也是W合1所下的RE。可以用2的RE来改q?/p>

  2. \belvis\b (elvis视ؓ一整体的字查找Q如elvis、Elvis乎略字符大小写时)
“\b”在RE中有特别的意思,在上q的例子中所指的是字的边界Q所以\belvis\b用\b把elvis的前后边界界定出来,也就是要elvisq个字?/p>

  假设要将同一行里elvis后接有alive的文字符串找出来Q此时就会用到另外二个特别意义的字符”.”?rdquo;*”?rdquo;.”所代表是除了换行字符的Q意字W,?rdquo;*”所代表的是重复*之前目直到扑ֈW合RE的字W串。所?rdquo;.*”所指的是除了换行字符外的L数目的字W数。所以查扑֐一行里elvis后接有alive的文字符串找出来Q则可下?之RE?/p>

  3. \belvis\b.*\balive\b (查找elvis后面接有alive的文字符Ԍ如elvis is alive)

  用简单之特别字符可以组成功能强大的REQ但也发现当使用来多的特别字W时QRE׃来难看得懂了?br />再看看另外的例子

  l成有效的电话号?/p>

  假要从|页上收集顾客格式ؓxxx-xxxx?位数字的电话LQ其中x是数字,RE可能会这样写?/p>

  4. \b\d\d\d-\d\d\d\d (查找七位数字之电话号码,?23-1234)
  每一个\d代表一个数字?rdquo;-”则是一般的q字W号Qؓ避免太多重复的\dQRE可以改写成如5的方式?/p>

  5. \b\d{3}-\d{4} (查找七位数字电话L较好的方法,?23-1234)
  在\d后的{3}Q代表重复前一个项目三ơ,也就是相{于\d\d\d?/p>

  RE的学习及试工具 Expresso

  因ؓRE不易阅读及用者容易会下错RE的特性,Jim大大开发了一个工兯Y件ExpressoQ用来帮助用者学习及试REQ除了上面所q的|址之外Q也可以上Ultrapico|站(http://www.Ultrapico.com)。安装完Expresso后,在Expression Library中,Jim大大把文章的例子都徏立在其中Q可以边看文章边试Q也可以试着修改范例所下的REQ马上可以看到结果,弟觉得非常好用。各位大大可以试试?/p>

  .NET中RE的基概念

  Ҏ字符

  有些字符有特别的意义Q比如之前所看到?rdquo;\b”?rdquo;.”?rdquo;*”?rdquo;\d”{?rdquo;\s”所代表的是LI格W,比如说spaces、tabs、newlines{??rdquo;\w”代表是Q意字母或数字字符?/p>

  再看一些例子吧

  6. \ba\w*\b (查找a开头的字,如able)
  qRE描述要查找一个字的开始边?\b)Q再来是字母”a”Q再加Q意数目的字母数字(\w*)Q再接结束这个字的结束边?\b)?/p>

  7. \d+ (查找数字字符?
  “+”?rdquo;*”非常怼Q除?臛_要重复前面的目一ơ。也是说至有一个数字?/p>

  8. \b\w{6}\b (查找六个字母数字的字Q如ab123c)

  下表为RE常用的特D字W?/p>

  . 除了换行字符的Q意字W?br />  \w L字母数字字符
  \s LI格W?br />  \d L数字字符
  \b 界定字的边界
  ^ 文章的开_?rdquo;^The'' 用以表示出现于文章开头的字符串ؓ”The”
  $ 文章的结,?rdquo;End$”用以表示出现在文章的l尾?rdquo;End”
  Ҏ字符”^”?rdquo;$”是用来查找某些字必需是文章的开头或l尾Q这在验证输入是否符合某一样式时特别用有,比如说要验证七位数字的电话号码,可能会输入如?的RE?/p>

  9. ^\d{3}-\d{4}$ (验证七位数字之电话号?

  q和W?个RE相同Q但其前后都无其它的字符Q也是整串字符串只有这七个数字的电话号码。在.NET中如果设定Multilineq个选项Q则”^”?rdquo;$”会每行进行比较,只要某行的开头结合RE卛_Q而不是整个文章字W串做一ơ比较?/p>

  转意字符(Escaped characters)

  有时可能会需?rdquo;^”?rdquo;$”单纯的字面意?literal meaning)而不要将它们当成Ҏ字符Q此?rdquo;\”字符是用来U除Ҏ字符特别意义的字W,因此”\^”?rdquo;\.”?rdquo;\\”所代表的就?rdquo;^”?rdquo;.”?rdquo;\”的字面意义?/p>

  重复前述目

  在前面看q?rdquo;{3}”?rdquo;*”可以用来重复前述字符Q之后我们会看到如何用同L语法重复整个ơ描q?subexpressions)。下表是使用重复前述目的一些方式?/p>

  * 重复Lơ数
  + 重复臛_一?br />  ? 重复零次或一?br />  {n} 重复n?br />  {n,m} 重复臛_nơ,但不过m?br />  {n,} 重复臛_n?/p>

  再来试一些例子吧

  10. \b\w{5,6}\b (查找五个或六个字母数字字W的字,如as25d、d58sdf{?
  11. \b\d{3}\s\d{3}-\d{4} (查找十个数字的电话号码,?00 123-1234)
  12. \d{3}-\d{2}-\d{4} (查找C会保险LQ如 123-45-6789)
  13. ^\w* (每行或整文章的W一个字)
  在Espresso可试试有Multiline和没Multiline的不同?br />

匚w某范围的字符

  有时需要查找某些特定的字符时怎么?q时中括?rdquo;[]”派上了用场。因此[aeiou]所要查扄?rdquo;a”?rdquo;e”?rdquo;i”?rdquo;o”?rdquo;u”q些元音Q[.?!]所要查扄?rdquo;.”?rdquo;?”?rdquo;!”q些W号Q在中括号中的特D字W的特别意义都会被移除,也就是解译成单纯的字面意义。也可以指定某些范围的字W,?rdquo;[a-z0-9]”Q所指的是L写字母或Q意数字?/p>

  接下来再看一个比较初复杂查找电话L的RE例子

  14. \(?\d{3}[( ] \s?\d{3}[- ]\d{4} (查找十位数字之电话号码,?080) 333-1234 )

  q样的RE可查扑և较多U格式的电话LQ如(080) 123-4567?11 254 6654{?rdquo;\(?”代表一个或零个左小括号”(“Q?rdquo;[( ]”代表查找一个右括?rdquo;)”或空格符Q?rdquo;\s?”指一个或零个I格W组。但q样的RE会将cM”800) 45-3321”q样的电话找出来Q也是括号没有对称q的问题,之后会学到择一(alternatives)来决解这L问题?/p>

  不包含在某特定字W组?Negation)

  有时需要查扑֜包含在某特定字符l里的字W,下表说明如何做类DL描述?/p>

  \W 不是字母数字的Q意字W?br />  \S 不是I格W的L字符
  \D 不是数字字符的Q意字W?br />  \B 不在字边界的位置
  [^x] 不是x的Q意字W?br />  [^aeiou] 不是a、e、i、o、u的Q意字W?/p>

  15. \S+ (不包含空格符的字W串)

  择一(Alternatives)

  有时会需要查扑և个特定的选择Q此?rdquo;|”q个Ҏ字符派上用ZQD例来_要查找五个数字及九个数字(?rdquo;-”?的邮政编码?/p>

  16. \b\d{5}-\d{4}\b|\b\d{5}\b (查找五个数字及九个数??rdquo;-”?的邮政编?

  在用Alternatives旉要注意的是前后的ơ序Q因为RE在Alternatives中会优先选择W合最左边的项目,16中,如果把查找五个数字的目攑֜前面Q则qRE只会扑ֈ五个数字的邮政编码。了解了择一Q可?4做更好的修正?/p>

  17. (\(\d{3}\)|\d{3})\s?\d{3}[- ]\d{4} (十个数字的电话号?

  组(Grouping)

  括号可以用来介定一个次描述Q经由次描述的介定,可以针对ơ描q做重复或及他的处理?/p>

  18. (\d{1,3}\.){3}\d{1,3} (L|络地址的简单RE)

  此RE的意思第一个部?\d{1,3}\.){3}Q所指的是,数字最一位最多三位,q且后面接有”.”W号Q此cd的共有三个,之后再接一C位的数字Q也是?92.72.28.1q样的数字?/p>

  但这样会有个~点Q因为网l地址数字最多只?55Q但上述的RE只要是一C位的数字都是W合的,所以这需要让比较的数字小?56才行Q但只单独用REq无法做q样的比较。在19中用择一来将地址的限制在所需要的范围内,也就??55?/p>

  19. ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) (L|络地址)

  有没有发觉RE来像外星的话?׃单的L|络地址Q直接看RE都满隄解的哩?/p>

  Expresso Analyzer View

  Expresso提供了一个功能,它可以将所下的RE变成树状的说明,一l组的分开说明Q提供了一个好的除错环境。其它的功能Q如部分W合(Partial Match只查扑֏白RE的部?及除外符?Exclude Match只不查找反白RE的部?ql各位大大试试啰?/p>

  当次描述用括Llv来时Q符合次描述的文字可用在之后的程序处理或RE本n。在预设的情型下Q所W合的群l是由数字命名,?开始,由顺序是由左臛_Q这自动组命名Q可在Expresso中的skeleton view或result view中看到?/p>

  Backreference是用来查扄l中抓取的符合文字所相同的文字。D例来?rdquo;\1”所指符合群l?所抓取的文字?/p>

  20. \b(\w+)\b\s*\1\b (L重复字,此处说的重复是指同样的字Q中间有I白隔开如dog dogq样的字)
(\w+)会抓取至一个字W的字母或数字的字,q将它命名ؓ组1Q之后是查找LI格W,再接和群l?相同的文字?/p>

  如果不喜Ƣ群l自动命名的1Q也可以自行命名Q以上述例子ZQ?\w+)改写??<Word>\w+)Q这是所抓取的群l命名ؓWordQBackreferencep改写成ؓ\k<Word>

21. \b(?<Word>\w+)\b\s*\k<Word>\b (使用自行命名组抓取重复?

  使用括号q有许多特别的语法元素,比较通用的列表如下:

  抓取(Captures)
  (exp) W合expq抓取它q自动命名的组
  (?<name>exp) W合expq抓取它q命名的组name
  (?:exp) W合expQ不抓取?br />  Lookarounds
  (?=exp) W合字尾为exp的文?br />  (?<=exp) W合前缀为exp的文?br />  (?!exp) W合后面没接exp字尾的文?br />  (?<!exp) W合前面没接exp前缀的文?br />  ҎComment
  (?#comment) Ҏ

  Positive Lookaround

  接下来要谈的是lookahead及lookbehind assertions。它们所查找的是目前W合之前或之后的文字Qƈ不包含目前符合本w。这些就如同”^”?rdquo;\b”Ҏ字符Q本wƈ不会对应M文字(用来界定位置)Q也因此U做是zero-width assertionsQ看些例子也怼清楚些?/p>

  (?=exp)是一?rdquo;zero-width positive lookahead assertion”。它指的是W合字尾为exp的文字,但不包含exp本n?/p>

  22. \b\w+(?=ing\b) (字尾为ing的字Q比如说filling所W合的就是fill)
(?<=exp)是一?rdquo;zero-width positive lookbehind assertion”。它指的是W合前缀为exp的文字,但不包含exp本n?/p>

  23. (?<=\bre)\w+\b (前缀为re的字Q比如说repeated所W合的就是peated)
  24. (?<=\d)\d{3}\b (在字三位数字Q且之前接一位数?
  25. (?<=\s)\w+(?=\s) (q格符分隔开的字母数字字W串)

  Negative Lookaround

  之前有提刎ͼ如何查找一个非特定或非在特定群l的字符。但如果只是要验证某字符不存在而不要对应这些字W进来呢?举个例子来说Q假设要查找一个字Q它的字母里有q但接下来的字母不是uQ可以用下列的RE来做?/p>

  26. \b\w*q[^u]\w*\b (一个字Q其字母里有q但接下来的字母不是u)

  q样的RE会有一个问题,因ؓ[^u]要对应一个字W,所以若q是字的最后一个字母,[^u]q样的下法就会将I格W对应下去,l果有可能会符合二个字Q比如说”Iraq haha”q样的文字。用Negative Lookaroundp解决q样的问题?/p>

  27. \b\w*q(?!u)\w*\b (一个字Q其字母里有q但接下来的字母不是u)
  q是”zero-width negative lookahead assertion”?/p>

  28. \d{3}(?!\d) (三个位的数字Q其后不接一个位数字)

  同样的,可以使用(?<!exp)Q?rdquo;zero-width negative lookbehind assertion”Q来W合前面没接exp前缀的文字符丌Ӏ?/p>

  29. (?<![a-z ])\w{7} (七个字母数字的字W串Q其前面没接字母或空?

  30. (?<=<(\w+)>).*(?=<\/\1>) (HTMLh间的文字)
  q用lookahead及lookbehind assertion来取出HTML间的文字Q不包括HTMLh?/p>

  h?Comments Please)
  括号q有个特D的用途就是用来包住批注,语法?rdquo;(?#comment)”Q若讑֮”Ignore Pattern Whitespace”选项Q则RE中的I格W当RE使用时会乎略。此选项讑֮Ӟ”#”之后的文字会乎略?/p>

  31. HTMLh间的文字Q加上批?/p>

  (?<=   #查找前缀Q但不包含它
  <(\w+)> #HTML标签
  )       #l束查找前缀
  .*      #W合M文字
  (?=     #查找字尾Q但不包含它
  <\/\1>  #W合所抓取组1之字W串Q也是前面括LHTML标签
  )       #l束查找字尾

  L最多字W的字及最字W的?Greedy and Lazy)
  当RE下要查找一个范围的重复??rdquo;.*”)Q它通常会寻找最多字W的W合字,也就是Greedy matching。D例来说?/p>

  32. a.*b  (开始ؓal束为b的最多字W的W合?

  若有一字符串是”aabab”Q用上qRE所得到的符合字W串是”aabab”Q因是寻找最多字W的字。有时希望是W合最字W的字也是lazy matching。只要将重复前述目的表加上问号(?)可以把它们全部变成lazy matching。因?rdquo;*?”代表的就是重复Q意次敎ͼ但是使用最重复的ơ数来符合。D个例子来_

  33. a.*?b (开始ؓal束为b的最字W的W合?

  若有一字符串是”aabab”Q用上qREW一个所得到的符合字W串是”aab”再来?rdquo;ab”Q因是寻找最字W的字?/p>

  *? 重复Lơ数Q最重复次Cؓ原则
  +? 重复臛_一ơ,最重复次Cؓ原则
  ?? 重复零次或一ơ,最重复次Cؓ原则
  {n,m}? 重复臛_nơ,但不过mơ,最重复次Cؓ原则
  {n,}? 重复臛_nơ,最重复次Cؓ原则

  q有什么没提到?

  到目前ؓ止,已经提到了许多徏立RE的元素,当然q有许多元素没有提到Q下表整理了一些没提到的元素,在最左边的字D늚数字是说明在Expresso中的例子?/p>

  # 语法 说明

  \a Bell 字符
  \b 通常是指字的边界Q在字符l里所代表的就是backspace
  \t Tab

  34 \r Carriage return

  \v Vertical Tab
  \f From feed

  35 \n New line
   \e Escape

  36 \nnn ASCII八位码ؓnnn的字W?/p>

  37 \xnn 十六位码为nn的字W?/p>

  38 \unnnn Unicode为nnnn的字W?/p>

  39 \cN Control N字符QD例来说Ctrl-M是\cM

  40 \A 字符串的开?和^怼Q但不需c由multiline选项)

  41 \Z 字符串的l尾
  \z 字符串的l尾

  42 \G 目前查找的开?/p>

  43 \p{name} Unicode 字符l名UCؓname的字W,比如说\p{Lowercase_Letter} 所指的是写?br />  (?>exp) Greedyơ描qͼ又称之ؓnon-backtrackingơ描q。这只符合一ơ且不采backtracking?/p>

  44 (?<x>-<y>exp)

  or (?-<y>exp) q组。虽复杂但好用。它让已命名的抓取群l可以在堆栈中操作用?弟对这个也是不太懂?

  45 (?im-nsx:exp) 为次描述exp更改RE选项Q比??-i:Elvis)是把Elvis大乎略大写的选项x

  46 (?im-nsx) Z后的组更改RE选项?br />  (?(exp)yes|no) ơ描qexp视ؓzero-width positive lookahead。若此时有符合,则yesơ描qCؓ下一个符合标的,若否Q则no ơ描qCؓ下一个符合标的?br />  (?(exp)yes) 和上q相同但无noơ描q?br />  (?(name)yes|no) 若name组为有效群l名Uͼ则yesơ描qCؓ下一个符合标的,若否Q则no ơ描qCؓ下一个符合标的?/p>

  47 (?(name)yes) 和上q相同但无noơ描q?/p>

  l论

  l过了一q串的例子,及Expresso的帮忙,怿各位大大对RE有个基本的了解,|络上当然有许多有关于RE的文章,如果各位大大有兴?a >http://www.codeproject.com q有许多关于RE的相x章。若大大对书有兴的话,Jeffrey Friedl的Mastering Regular Expressions很多大大都有?弟q没拜读)。希望籍pL心得报告Q能让对RE有兴的大大能羃短学习曲U,当然q是弟W一ơ接触REQ若文章中有什么错误或说明的不好的地方Q可要请各位大大体谅Qƈ请各位大大将需要修正的地方maill小弟,弟会非常感谢各位大大?/p>





q年 2006-04-24 16:36 发表评论
]]>
JAVA正则表达?U常用功?/title><link>http://www.tkk7.com/jackylpz/archive/2006/04/24/42844.html</link><dc:creator>q年</dc:creator><author>q年</author><pubDate>Mon, 24 Apr 2006 08:31:00 GMT</pubDate><guid>http://www.tkk7.com/jackylpz/archive/2006/04/24/42844.html</guid><wfw:comment>http://www.tkk7.com/jackylpz/comments/42844.html</wfw:comment><comments>http://www.tkk7.com/jackylpz/archive/2006/04/24/42844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jackylpz/comments/commentRss/42844.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jackylpz/services/trackbacks/42844.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0"> <tbody> <tr> <td class="title1" align="center" width="100%" bgcolor="#eeeeee" colspan="3" height="40"><strong>JAVA正则表达?U常用功?/strong></td> </tr> <tr> <td align="center" width="100%" bgcolor="#eeeeee"> </td> </tr> </tbody> </table> </td> </tr> <!-- end of article title --> <tr> <td valign="top" align="center" width="100%"><!--start of article content --> <table width="98%" border="0"> <tbody> <tr> <td class="text" align="left" width="100%"><br />JAVA正则表达?U常用功?nbsp;<br />   <br />  正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持 <br /> <br />  下面单的说下它的4U常用功能:<br />  <br />  查询Q?br />  <br />以下是代码片D:<br /> String str="abc efg ABC"; <br /> <br />String regEx="a|f"; //表示a或f <br /> <br /> Pattern p=Pattern.compile(regEx); <br /> <br /> Matcher m=p.matcher(str); <br /> <br /> boolean rs=m.find(); <br /><br />  <br />  如果str中有regExQ那么rs为trueQ否则ؓflase。如果想在查找时忽略大小写,则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />  <br />  提取Q?br />以下是代码片D:<br /> String regEx=".+\(.+)$"; <br /> <br />String str="c:\dir1\dir2\name.txt"; <br /> <br /> Pattern p=Pattern.compile(regEx); <br /> <br /> Matcher m=p.matcher(str); <br /> <br /> boolean rs=m.find(); <br /> <br /> for(int i=1;i<=m.groupCount();i++){ <br /> <br /> System.out.println(m.group(i)); <br /> <br /> } <br /><br />  <br />  以上的执行结果ؓname.txtQ提取的字符串储存在m.group(i)中,其中i最大gؓm.groupCount();<br />  <br />  分割Q?br />  <br />以下是代码片D:<br />String regEx="::"; <br /> <br /> Pattern p=Pattern.compile(regEx); <br /> <br /> String[] r=p.split("xd::abc::cde"); <br /> <br /> 执行后,r是{"xd","abc","cde"}Q其实分割时q有跟简单的ҎQ?nbsp;<br /> <br /> String str="xd::abc::cde"; <br /> <br /> String[] r=str.split("::"); <br /><br />  <br />  替换Q删除)Q?br />  <br />以下是代码片D:<br /> String regEx="a+"; //表示一个或多个a <br /><br /> Pattern p=Pattern.compile(regEx); <br /> <br /> Matcher m=p.matcher("aaabbced a ccdeaa"); <br /> <br /> String s=m.replaceAll("A"); <br />  <br />  l果?quot;Abbced A ccdeA"<br />  <br />  如果写成IZQ既可达到删除的功能Q比如:<br />  <br />String s=m.replaceAll("");<br />  <br />  l果?quot;bbced ccde"<br />  <br />  附:<br />  <br /> \D {於 [^0-9] 非数?nbsp;<br /> \s {於 [ \t\n\x0B\f ] I白字元 <br /> \S {於 [^ \t\n\x0B\f ] 非空白字?nbsp;<br /> \w {於 [a-zA-Z_0-9] 数字或是英文?nbsp;<br />  \W {於 [^a-zA-Z_0-9] 非数字与英文?nbsp;<br />  <br />  ^ 表示每行的开?br />  $ 表示每行的结?/td> </tr> </tbody> </table> </td> </tr> </tbody> </table><img src ="http://www.tkk7.com/jackylpz/aggbug/42844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jackylpz/" target="_blank">q年</a> 2006-04-24 16:31 <a href="http://www.tkk7.com/jackylpz/archive/2006/04/24/42844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式详?/title><link>http://www.tkk7.com/jackylpz/archive/2006/04/24/42814.html</link><dc:creator>q年</dc:creator><author>q年</author><pubDate>Mon, 24 Apr 2006 04:48:00 GMT</pubDate><guid>http://www.tkk7.com/jackylpz/archive/2006/04/24/42814.html</guid><wfw:comment>http://www.tkk7.com/jackylpz/comments/42814.html</wfw:comment><comments>http://www.tkk7.com/jackylpz/archive/2006/04/24/42814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jackylpz/comments/commentRss/42814.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jackylpz/services/trackbacks/42814.html</trackback:ping><description><![CDATA[<table width="620" align="center"> <tbody> <tr> <td class="a14">如果你曾l用qPerl或Q何其他内建正则表辑ּ支持的语aQ你一定知道用正则表达式处理文本和匚w模式是多么简单。如果你不熟悉这个术语,那么“正则表达?rdquo;QRegular ExpressionQ就是一个字W构成的Ԍ它定义了一个用来搜索匹配字W串的模式?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">许多语言Q包括Perl、PHP、Python、JavaScript和JScriptQ都支持用正则表辑ּ处理文本Q一些文本编辑器用正则表辑ּ实现高“搜烦-替换”功能。那么Java又怎样呢?本文写作Ӟ一个包含了用正则表辑ּq行文本处理的Java规范需求(Specification RequestQ已l得到认可,你可以期待在JDK的下一版本中看到它?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">然而,如果现在需要用正则表辑ּQ又该怎么办呢Q你可以从Apache.org下蝲源代码开攄Jakarta-ORO库。本文接下来的内容先要地介绍正则表达式的入门知识Q然后以Jakarta-ORO APIZ介绍如何使用正则表达式?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong><font size="4">一、正则表辑ּ基础知识</font></strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">我们先从单的开始。假设你要搜索一个包含字W?ldquo;cat”的字W串Q搜索用的正则表辑ּ是“cat”。如果搜索对大小写不敏感Q单?ldquo;catalog”?ldquo;Catherine”?ldquo;sophisticated”都可以匹配。也是_ </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_a.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>1.1 句点W号</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">假设你在玩英文拼字游戏,惌扑և三个字母的单词,而且q些单词必须?ldquo;t”字母开_?ldquo;n”字母l束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内宏V要构造出q个正则表达式,你可以用一个通配W?mdash;—句点W号“.”。这P完整的表辑ּ是“t.n”Q它匚w“tan”?ldquo;ten”?ldquo;tin”?ldquo;ton”Q还匚w“t#n”?ldquo;tpn”甚至“t n”Q还有其他许多无意义的组合。这是因为句点符号匹配所有字W,包括I格、Tab字符甚至换行W: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_b.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>1.2 ҎL?/strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">Z解决句点W号匚w范围q于q泛q一问题Q你可以在方括号Q?ldquo;[]”Q里面指定看来有意义的字W。此Ӟ只有Ҏ号里面指定的字符才参与匹配。也是_正则表达?ldquo;t[aeio]n”只匹?ldquo;tan”?ldquo;Ten”?ldquo;tin”?ldquo;ton”。但“Toon”不匹配,因ؓ在方括号之内你只能匹配单个字W: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_c.jpg" border="0" alt="" /></td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>1.3 “?rdquo;W号</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">如果除了上面匚w的所有单词之外,你还惌匚w“toon”Q那么,你可以?ldquo;|”操作W?ldquo;|”操作W的基本意义是“?rdquo;q算。要匚w“toon”Q?ldquo;t(a|e|i|o|oo)n”正则表达式。这里不能用方扩号Q因为方括号只允许匹配单个字W;q里必须使用圆括?ldquo;()”。圆括号q可以用来分l,具体请参见后面介l?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_d.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>1.4 表示匚wơ数的符?/strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">表一昄了表C匹配次数的W号Q这些符L来确定紧靠该W号左边的符号出现的ơ数Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4n.jpg" border="0" alt="" /></p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">假设我们要在文本文g中搜索美国的C会安全L。这个号码的格式?99-99-9999。用来匹配它的正则表辑ּ如图一所C。在正则表达式中Q连字符Q?ldquo;-”Q有着Ҏ的意义,它表CZ个范_比如??。因此,匚wC会安全L中的q字W号Ӟ它的前面要加上一个{义字W?ldquo;\”?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4a.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图一Q匹配所?23-12-1234形式的社会安全号?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">假设q行搜烦的时候,你希望连字符号可以出玎ͼ也可以不出现——卻I999-99-9999?99999999都属于正的格式。这Ӟ你可以在q字W号后面加上“Q?rdquo;数量限定W号Q如图二所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4b.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图二Q匹配所?23-12-1234?23121234形式的社会安全号?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">下面我们再来看另外一个例子。美国汽车牌照的一U格式是四个数字加上二个字母。它的正则表辑ּ前面是数字部?ldquo;[0-9]{4}”Q再加上字母部分“[A-Z]{2}”。图三显CZ完整的正则表辑ּ?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4c.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图三Q匹配典型的国汽R牌照LQ如8836KV</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">1.5 “?rdquo;W号 </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">“^”W号UCؓ“?rdquo;W号。如果用在方括号内,“^”表示不想要匹配的字符。例如,囑֛的正则表辑ּ匚w所有单词,但以“X”字母开头的单词除外?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4d.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑֛Q匹配所有单词,?ldquo;X”开头的除外</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">1.6 圆括号和I白W号 </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">假设要从格式?ldquo;June 26, 1951”的生日日期中提取出月份部分,用来匚w该日期的正则表达式可以如图五所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4e.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图五Q匹配所有Moth DD,YYYY格式的日?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">新出现的“\s”W号是空白符P匚w所有的I白字符Q包括Tab字符。如果字W串正确匚wQ接下来如何提取出月份部分呢Q只需在月份周围加上一个圆括号创徏一个组Q然后用ORO APIQ本文后面详l讨论)提取出它的倹{修改后的正则表辑ּ如图六所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4f.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑օQ匹配所有Month DD,YYYY格式的日期,定义月䆾gؓW一个组</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>1.7 其它W号</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">为简便v见,你可以用一些ؓ常见正则表达式创建的快捷W号。如表二所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">表二Q常用符?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4o.jpg" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">例如Q在前面C会安全L的例子中Q所有出?ldquo;[0-9]”的地Ҏ们都可以使用“\d”。修改后的正则表辑ּ如图七所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4g.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图七Q匹配所?23-12-1234格式的社会安全号?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong><font size="4">二、Jakarta-ORO?/font></strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">有许多源代码开攄正则表达式库可供JavaE序员用,而且它们中的许多支持Perl 5兼容的正则表辑ּ语法。我在这里选用的是Jakarta-ORO正则表达式库Q它是最全面的正则表辑ּAPI之一Q而且它与Perl 5正则表达式完全兼宏V另外,它也是优化得最好的API之一?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">Jakarta-ORO库以前叫做OROMatcherQDaniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下蝲它?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">我首先将要介l用Jakarta-ORO库时你必d建和讉K的对象,然后介绍如何使用Jakarta-ORO API?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>?PatternCompiler对象</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">首先Q创Z个Perl5Compilercȝ实例Qƈ把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实玎ͼ允许你把正则表达式编译成用来匚w的Pattern对象?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_e.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>?Pattern对象</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">要把正则表达式编译成Pattern对象Q调用compiler对象的compile()ҎQƈ在调用参C指定正则表达式。例如,你可以按照下面这U方式编译正则表辑ּ“t[aeio]n”Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_f.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">默认情况下,~译器创Z个大写敏感的模式(patternQ。因此,上面代码~译得到的模式只匚w“tin”?ldquo;tan”?“ten”?ldquo;ton”Q但不匹?ldquo;Tin”?ldquo;taN”。要创徏一个大写不敏感的模式Q你应该在调用编译器的时候指定一个额外的参数Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_g.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">创徏好Pattern对象之后Q你可以通过PatternMatchercȝ该Pattern对象q行模式匚w?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>?PatternMatcher对象</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">PatternMatcher对象ҎPattern对象和字W串q行匚w查。你要实例化一个Perl5Matchercdƈ把结果赋值给PatternMatcher接口。Perl5MatchercLPatternMatcher接口的一个实玎ͼ它根据Perl 5正则表达式语法进行模式匹配: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_h.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">使用PatternMatcher对象Q你可以用多个方法进行匹配操作,q些Ҏ的第一个参数都是需要根据正则表辑ּq行匚w的字W串Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean matches(String input, Pattern pattern)Q当输入字符串和正则表达式要_匚w时用。换句话_正则表达式必d整地描述输入字符丌Ӏ?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean matchesPrefix(String input, Pattern pattern)Q当正则表达式匹配输入字W串起始部分时用?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean contains(String input, Pattern pattern)Q当正则表达式要匚w输入字符串的一部分时用(卻I它必L一个子Ԍ?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">另外Q在上面三个Ҏ调用中,你还可以用PatternMatcherInput对象作ؓ参数替代String对象Q这Ӟ你可以从字符串中最后一ơ匹配的位置开始l进行匹配。当字符串可能有多个子串匚wl定的正则表辑ּӞ用PatternMatcherInput对象作ؓ参数很有用了。用PatternMatcherInput对象作ؓ参数替代StringӞ上述三个Ҏ的语法如下: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean matches(PatternMatcherInput input, Pattern pattern) </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">· boolean contains(PatternMatcherInput input, Pattern pattern) </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong><font size="4">三、应用实?/font></strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">下面我们来看看Jakarta-ORO库的一些应用实例?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>3.1 日志文g处理</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">dQ分析一个Web服务器日志文Ӟ定每一个用戯在网站上的时间。在典型的BEA WebLogic日志文g中,日志记录的格式如下: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_i.jpg" border="0" alt="" /></td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">分析q个日志记录Q可以发玎ͼ要从q个日志文g提取的内Ҏ两项QIP地址和页面访问时间。你可以用分l符P圆括P从日志记录提取出IP地址和时间标记?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">首先我们来看看IP地址。IP地址?个字节构成,每一个字节的值在0?55之间Q各个字节通过一个句点分隔。因此,IP地址中的每一个字节有臛_一个、最多三个数字。图八显CZ为IP地址~写的正则表辑ּQ?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4h.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑օQ匹配IP地址</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">IP地址中的句点字符必须q行转义处理Q前面加?ldquo;\”Q,因ؓIP地址中的句点h它本来的含义Q而不是采用正则表辑ּ语法中的Ҏ含义。句点在正则表达式中的特D含义本文前面已l介l?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">日志记录的时间部分由一Ҏ括号包围。你可以按照如下思\提取出方括号里面的所有内容:首先搜烦起始Ҏ号字W(“[”Q,提取出所有不过l束Ҏ号字W(“]”Q的内容Q向前寻扄x到结束方括号字符。图九显CZq部分的正则表达式?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4i.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">图九Q匹配至一个字W,直至扑ֈ“]”</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">现在Q把上述两个正则表达式加上分l符P圆括P后合q成单个表达式,q样可以从日志记录提取出IP地址和时间。注意,Z匚w“- -”Q但不提取它Q,正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如囑֍所C?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4j.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑֍Q匹配IP地址和时间标?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">现在正则表达式已l编写完毕,接下来可以编写用正则表辑ּ库的Java代码了?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">Z用Jakarta-ORO库,首先创徏正则表达式字W串和待分析的日志记录字W串Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_j.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">q里使用的正则表辑ּ与图十的正则表达式差不多完全相同Q但有一点例外:在Java中,你必d每一个向前的斜杠Q?ldquo;\”Q进行{义处理。图十不是Java的表CŞ式,所以我们要在每?ldquo;\”前面加上一?ldquo;\”以免出现~译错误。遗憄是,转义处理q程很容易出现错误,所以应该小心}慎。你可以首先输入未经转义处理的正则表辑ּQ然后从左到右依ơ把每一?ldquo;\”替换?ldquo;\\”。如果要复检Q你可以试着把它输出到屏q上?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">初始化字W串之后Q实例化PatternCompiler对象Q用PatternCompiler~译正则表达式创Z个Pattern对象Q?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_k.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">现在Q创建PatternMatcher对象Q调用PatternMatcher接口的contain()Ҏ查匹配情况: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_l.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">接下来,利用PatternMatcher接口q回的MatchResult对象Q输出匹配的l。由于logEntry字符串包含匹配的内容Q你可以看到cd下面的输出: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_m.jpg" border="0" alt="" /></td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>3.2 HTML处理实例一</strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">下面一个Q务是分析HTML面内FONT标记的所有属性。HTML面内典型的FONT标记如下所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><font face="Arial, Serif" color="#ff0000" size="+2"></font><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_n.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">E序按照如下Ş式,输出每一个FONT标记的属性: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_o.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">在这U情况下Q我你用两个正则表辑ּ。第一个如囑֍一所C,它从字体标记提取?ldquo;"face="Arial, Serif" size="+2" color="red"”?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4k.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑֍一Q匹配FONT标记的所有属?/p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">W二个正则表辑ּ如图十二所C,它把各个属性分割成名字-值对?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4l.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑֍二:匚w单个属性,q把它分割成名字-值对</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">分割l果为: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_p.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">现在我们来看看完成这个Q务的Java代码。首先创Z个正则表辑ּ字符Ԍ用Perl5Compiler把它们编译成Pattern对象。编译正则表辑ּ的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项Q得匹配操作不区分大小写?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">接下来,创徏一个执行匹配操作的Perl5Matcher对象?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_q.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">假设有一个Stringcd的变量htmlQ它代表了HTML文g中的一行内宏V如果html字符串包含FONT标记Q匹配器返回true。此Ӟ你可以用匚w器对象返回的MatchResult对象获得W一个组Q它包含了FONT的所有属性: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_r.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">接下来创Z个PatternMatcherInput对象。这个对象允怽从最后一ơ匹配的位置开始l进行匹配操作,因此Q它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象Q以参数形式传入待匹配的字符丌Ӏ然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象Q而不是字W串对象Qؓ参数Q反复地调用PatternMatcher对象的contains()Ҏ完成。PatternMatcherInput对象之中的每一ơP代将把它内部的指针向前移动,下一ơ检将从前一ơ匹配位|的后面开始?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">本例的输出结果如下: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_s.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>3.3 HTML处理实例?/strong> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">下面我们来看看另一个处理HTML的例子。这一ơ,我们假定Web服务器从widgets.acme.comUd了newserver.acme.com。现在你要修改一些页面中的链接: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_t.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">执行q个搜烦的正则表辑ּ如图十三所C: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4m.gif" border="0" alt="" /> </p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"> <p align="center">囑֍三:匚w修改前的链接</p> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">如果能够匚wq个正则表达式,你可以用下面的内Ҏ换图十三的链接: </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><a ></a><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_u.jpg" border="0" alt="" /></td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">注意#字符的后面加上了$1。Perl正则表达式语法用$1?2{表C已l匹配且提取出来的组。图十三的表辑ּ把所有作Z个组匚w和提取出来的内容附加到链接的后面?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">现在Q返回Java。就象前面我们所做的那样Q你必须创徏试字符Ԍ创徏把正则表辑ּ~译到Pattern对象所必需的对象,以及创徏一个PatternMatcher对象Q?img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_v.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">接下来,用com.oroinc.text.regex包Utilcȝsubstitute()静态方法进行替换,输出l果字符Ԍ </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_w.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">Util.substitute()Ҏ的语法如下: </td> </tr> </tbody> </table> <table height="17" width="620" align="center"> <tbody> <tr> <td class="a14" height="13"><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_x.jpg" border="0" alt="" /> </td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14">q个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象Q它军_了替换操作如何进行。本例用的是Perl5Substitution对象Q它能够q行Perl5风格的替换。第四个参数是想要进行替换操作的字符Ԍ最后一个参数允许指定是否替换模式的所有匹配子ԌUtil.SUBSTITUTE_ALLQ,或只替换指定的次数?</td> </tr> </tbody> </table> <table width="620" align="center"> <tbody> <tr> <td class="a14"><strong>【结束语?/strong>在这文章中Q我Z介绍了正则表辑ּ的强大功能。只要正运用,正则表达式能够在字符串提取和文本修改中v到很大的作用。另外,我还介绍了如何在JavaE序中通过Jakarta-ORO库利用正则表辑ּ。至于最l采用老式的字W串处理方式Q用StringTokenizerQcharAtQ和substringQ,q是采用正则表达式,q就有待你自己决定了?/td> </tr> </tbody> </table><img src ="http://www.tkk7.com/jackylpz/aggbug/42814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jackylpz/" target="_blank">q年</a> 2006-04-24 12:48 <a href="http://www.tkk7.com/jackylpz/archive/2006/04/24/42814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java源代码分?---jvm.dll装蝲q程http://www.tkk7.com/jackylpz/archive/2006/04/22/42546.htmlq年q年Sat, 22 Apr 2006 13:50:00 GMThttp://www.tkk7.com/jackylpz/archive/2006/04/22/42546.htmlhttp://www.tkk7.com/jackylpz/comments/42546.htmlhttp://www.tkk7.com/jackylpz/archive/2006/04/22/42546.html#Feedback0http://www.tkk7.com/jackylpz/comments/commentRss/42546.htmlhttp://www.tkk7.com/jackylpz/services/trackbacks/42546.htmlq?br />  
  众所周知java.exe是java class文g的执行程序,但实际上java.exeE序只是
  一个执行的外壳Q它会装载jvm.dllQwindows下,以下皆以windowsq_ZQ?br />  linux下和solaris下其实类|为:libjvm.soQ,q个动态连接库才是java
  虚拟机的实际操作处理所在。本文探Ijava.exeE序是如何查扑֒装蝲jvm.dll
  动态库Qƈ调用它进行class文g执行处理的?br />  
  源代?/strong>
  
  本文分析之代码,《JavaTM 2 SDK, Standard Edition, v1.4.2 fcs
  Community Source Release》,可从sun官方|站下蝲Q主要分析的源代码ؓQ?br />  j2se\src\share\bin\java.c
  j2se\src\windows\bin\java_md.c
  
  java.c是什么东?/strong>
  
  ‘javaE序’源代?br />  所?lsquo;javaE序’Q包括jdk中的java.exe\javac.exe\javadoc.exeQjava.c?br />  代码中通过JAVA_ARGS宏来控制生成的代码,如果该宏没定义则~译文g控制?br />  成java.exe否则~译文g控制生成其他?lsquo;javaE序’?br />  比如Q?br />  j2se\make\java\javac\MakefileQ这是javac~译文gQ中Q?br />  $(CD) ../../sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)
  j2se\make\sun\javac\javac\MakefileQ由上面Makefile文g调用Q中Q?br />  JAVA_ARGS = "{ \"-J-ms8m\", \"com.sun.tools.javac.Main\" }"
  则由同一份java.c代码生成的javac.exeE序׃直接调用javacL法:
  com.sun.tools.javac.MainQ这样其执行v来就像是直接q行的一个exe文gQ?br />  而未定义JAVA_ARGS的java.exeE序则会调用传递过来参C的类Ҏ?br />  
  从java.c的main入口函数说v
  
  main()函数中前面一Dؓ重新分配参数指针的处理?br />  然后调用函数QCreateExecutionEnvironmentQ该函数主要查找javaq行环境?br />  目录Q和jvm.dllq个虚拟机核心动态连接库文g路径所在。根据操作系l不同,
  该函数有不同实现版本Q但大体处理逻辑相同Q我们看看windowsq_该函数的?br />  理(j2se\src\windows\bin\java_md.cQ?br />  
  CreateExecutionEnvironment函数主要分ؓ三步处理Q?br />  a、查找jre路径?br />  b、装载jvm.cfg中指定的虚拟机动态连接库Qjvm.dllQ参数?br />  c、取jvm.dll文g路径?br />  
  实现Q?/strong>
  
  a、查找jre路径是通过java_md.c中函敎ͼGetJREPath实现的?br />  该函数首先调用GetApplicationHome函数QGetApplicationHome函数调用windows
  API函数GetModuleFileName取java.exeE序的绝对\径,以我的jdk安装路径ZQ?br />  为:“D:\java\j2sdk1.4.2_04\bin\java.exe”Q然后去掉文件名取绝对\径ؓQ?br />  “D:\java\j2sdk1.4.2_04\bin”Q之后会在去掉最后一U目录,现在l对路径为:
  “D:\java\j2sdk1.4.2_04”?br />  然后GetJREPath函数l箋判断刚刚取的路径+\bin\java.dlll合成的q个java.dll
  文g是否存在Q如果存在则“D:\java\j2sdk1.4.2_04”为JRE路径Q否则判断取?br />  ?ldquo;D:\java\j2sdk1.4.2_04”路径+\jre\bin\java.dll文g是否存在Q存在则
  “D:\java\j2sdk1.4.2_04\jre”为JRE路径。如果上面两U情况都不存在,则从?br />  册表中去查找Q参见函数GetPublicJREHomeQ?br />  
  函数QGetPublicJREHome先查?/strong>
  HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\CurrentVersion
  键?ldquo;当前JRE版本?rdquo;Q判?ldquo;当前JRE版本?rdquo;是否?.4做ؓ版本P如果是则
  取HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本?rdquo;
  \JavaHome的\径所在ؓJRE路径?br />  
  我的JDKq回的JRE路径为:“D:\java\j2sdk1.4.2_04\jre”?br />  
  b、装载jvm.cfg虚拟机动态连接库配置文g是通过java.c中函?ReadKnownVMs实现
  的?br />  该函数首先组合jvm.cfg文g的绝对\径,JRE路径+\lib+\ARCHQCPU构架Q?\jvm.cfg
  ARCHQCPU构架Q的判断是通过java_md.c中GetArch函数判断的,该函Cwindowsq?br />  台只有两U情况:WIN64?lsquo;ia64’Q其他情况都?lsquo;i386’。我的ؓi386所以jvm.cfg
  文gl对路径为:“D:\java\j2sdk1.4.2_04\jre\lib\i386\jvm.cfg”。文件内容如
  下:
  ## @(#)jvm.cfg  1.7 03/01/23# # Copyright 2003 Sun Microsystems, Inc. All rights reserved.# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.# # ### List of JVMs that can be used as an option to java, javac, etc.# Order is important -- first in this list is the default JVM.# NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release.## You may also select a JVM in an arbitrary location with the# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported# and may not be available in a future release.#-client KNOWN-server KNOWN-hotspot ALIASED_TO -client-classic WARN-native ERROR-green ERROR
  
  Q如果细心的话,我们会发现在JDK目录中我的ؓQ?ldquo;D:\java\j2sdk1.4.2_04\jre\bin\client”?ldquo;D:\java\j2sdk1.4.2_04\jre\bin\server”两个目录下都存在jvm.dll文g。而java正是通过jvm.cfg配置文g来管理这些不同版本的jvm.dll的。)
  
  ReadKnownVMs函数会将该文件中的配|内容读入到一个JVM配置l构的全局变量中,该函数首先蟩q注释(?lsquo;#’开始的行)Q然后读取以‘-’开始的行指定的jvm参数Q每一行ؓ一个jvm信息Q第一部分为jvm虚拟机名UͼW二部分为配|参敎ͼ比如行:
  “-client KNOWN”?ldquo;-client”拟机名称Q?ldquo;KNOWN”为配|类型参敎ͼ“KNOWN”
  表示该虚拟机的jvm.dll存在Q?ldquo;ALIASED_TO”表示为另一个jvm.dll的别名,“WARN”
  表示该虚拟机的jvm.dll不存在但q行时会用其他存在的jvm.dll替代执行Q?ldquo;ERROR”
  同样表示该类虚拟机的jvm.dll不存在且q行时不会找存在的jvm.dll替代而直接抛出错?br />  信息?br />  
  在运行javaE序时指定用那个虚拟机的判断是由java.c中函敎ͼCheckJvmType判断Q该函数会检查javaq行参数中是否有指定jvm的参敎ͼ然后从ReadKnownVMs函数d的jvm.cfg数据l构中去查找Q从而指定不同的jvmcdQ最l导致装载不同jvm.dllQ。有两种Ҏ可以指定jvmcdQ一U按照jvm.cfg文g中的jvm名称指定Q第二种Ҏ是直接指定,它们执行的方法分别是“java -J<jvm.cfg中jvm名称>”?ldquo;java -XXaltjvm=<jvmcd名称>”?ldquo;java -J-XXaltjvm=<jvmcd名称>”。如果是W一U参C递方式,CheckJvmType函数会取参数‘-J’后面的jvm名称Q然后从已知的jvm配置参数中查扑֦果找到同名的则去掉该jvm名称前的‘-’直接q回该|而第二种ҎQ会直接q回“-XXaltjvm=”?ldquo;-J-XXaltjvm=”后面的jvmcd名称Q如果在q行java时未指定上面两种Ҏ中的M一U参敎ͼCheckJvmType会取配置文g中第一个配|中的jvm名称Q去掉名U前面的‘-’q回该倹{CheckJvmType函数的这个返回g在下面的函数中汇同jre路径l合成jvm.dll的绝对\径?br />  
  比如Q如果在q行javaE序时?ldquo;java -J-client test”则ReadKnownVMs会读取参?ldquo;-client”然后查找jvm.cfgd的参C是否有jvm名称?ldquo;-client”的,如果有则Ljvm名称前的“-”直接q回“client”Q而如果在q行javaE序时用如下参敎ͼ
  “java -XXaltjvm=D:\java\j2sdk1.4.2_04\jre\bin\client test”Q则ReadKnownVMs
  会直接返?ldquo;D:\java\j2sdk1.4.2_04\jre\bin\client”Q如果不带上面参数执行如Q?br />  “java test”Q因为在jvm.cfg配置文g中第一个存在的jvm?ldquo;-client”Q所以函?br />  ReadKnownVMs也会Ljvm名称前的“-”q回“client”。其实这三中情况都是使用?br />  “D:\java\j2sdk1.4.2_04\jre\bin\client\jvm.dll”q个jvm动态连接库处理testq个class的,见下面GetJVMPath函数?br />  
  c、取jvm.dll文g路径是通过java_md.c中函敎ͼGetJVMPath实现的?br />  ׃面两步我们已l获得了JRE路径和jvm的类型字W串。GetJVMPath函数判断CheckJvmType
  q回的jvmcd字符串中是否包含?lsquo;\’?lsquo;/’如果包含则以该jvmcd字符?\jvm.dll作ؓJVM的全路径Q否则以JRE路径+\bin+\jvmcd字符?\jvm.dll作ؓJVM的全路径?br />  
  看看上面的例子,W一U情?ldquo;java -J-client test”jvm.dll路径为:
  JRE路径+\bin+\jvmcd字符?\jvm.dll 按照我的JDK路径则ؓQ?br />  “D:\java\j2sdk1.4.2_04\jre”+“\bin”+“\client”+“\jvm.dll”?br />  W二U情?ldquo;java -XXaltjvm=D:\java\j2sdk1.4.2_04\jre\bin\client test”路径为:
  jvmcd字符?\jvm.dll即ؓQ?ldquo;D:\java\j2sdk1.4.2_04\jre\bin\client”+“\jvm.dll”
  W三U情?ldquo;java test”为:“D:\java\j2sdk1.4.2_04\jre”+“\bin”+“\client”
  +“\jvm.dll”与情况一相同。所以这三种情况都是调用的jvm动态连接库“D:\javaj2sdk1.4.2_04\jre\bin\client\jvm.dll”处理testcȝ?br />  
  我们来进一步验证一下:
  打开cmd控制収ͼ
  
  讄java装蝲调试
  E:\work\java_research>set _JAVA_LAUNCHER_DEBUG=1
  
  情况一
  E:\work\java_research>java -J-client test.ScanDirectory
  ----_JAVA_LAUNCHER_DEBUG----



q年 2006-04-22 21:50 发表评论
]]>
ZJava的操作系l发展史Q?/title><link>http://www.tkk7.com/jackylpz/archive/2006/04/07/39749.html</link><dc:creator>q年</dc:creator><author>q年</author><pubDate>Fri, 07 Apr 2006 02:32:00 GMT</pubDate><guid>http://www.tkk7.com/jackylpz/archive/2006/04/07/39749.html</guid><wfw:comment>http://www.tkk7.com/jackylpz/comments/39749.html</wfw:comment><comments>http://www.tkk7.com/jackylpz/archive/2006/04/07/39749.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/jackylpz/comments/commentRss/39749.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jackylpz/services/trackbacks/39749.html</trackback:ping><description><![CDATA[<span id="rbxdllv" class="tpc_content">转自:http://blog.csdn.net/fasttalk/archive/2005/02/08/284637.aspx <br /><br />UJava操作pȝSavaJe已经得到q泛支持与商业应?<br />2005q?02?5?<br /><br /><br />贝尔实验室发明的SavaJe OS是一个纯Java操作pȝQ支持J2SEQ已l得到强大的商业支持QLG已经采用了SavaJe做ؓ?G手机 <br /><br />SavaJe OS, an open standards-based, 100% pure Java platform for mobile phones <br />全文Qhttp://www.savaje.com/ <br /><br />SavaJe有着优良的血l: <br />来自朗讯贝尔实验?<br />Lucent Technologies launches new venture, savaJe™ technologies, first company to offer full Java™ 2™ support for exploding information appliance market <br />下面的链接有详细的介l: <br />http://www.lucent.com/press/0600/000606.coa.html <br /><br /><br /><br />贝尔实验室总能l这个世界带来划时代的发明: <br /><br />C语言、C++、UNIX、电话、有声电影、电报、晶体管、激光器、太阌甉|、发光二极管、数字交换机、通讯卫星、电脑、手机、通讯|?........ <br /><br /><br />天哪Q?<br /><br />那么SavaJe............ <br /><br /><br /><br />有关SavaJeq有些事要说QSavaJe已经是一个非常成熟的操作pȝ了,它利用的是支持bytecode的ARM CPUQARM CPU占嵌入CPU市场的8Q%市场份额Q,而且SavaJe支持的是J2SEQ?<br /><br /><br />该公司说QSavaJe XE OS是第一个支持Java 2 Platform, Standard EditionQJ2SEQ标准版Q的型上网讑֤操作pȝ。实际上Q该领域中原来所有的Java支持都是支持Java 2 Platform, Micro EditionQJ2MEQ微型版本)?<br />http://www.pday.com.cn/news/2001/2001-09/092622.htm <br /><br /><br /><br /><br />SavaJe XEZ一代信息电器带来J2SE <br />无线Handheld的OS来多地渗入JavaQ现在J2ME、PersonalJava已经出现在各U手持设备包括PocketPC和Palm上,但是很多Z然认为J2SE(标准?q没有能直接用于各种IAQ直到SavaJe XE OS的出玎ͼ <br /><br />Sun|站上一文章详l讨ZSavaJe XE OSQ这个Javaq_不单单是一个虚拟机(VM)Q而且是一个真正的32位、多d、多U程的OSQ这是真正的J2SE的Handheld版本Q?<br /><br />SavaJe的CEO George Grey认ؓQSavaJe XE有两大优势,其一是J2SE已经有相当的开发者和应用Q其二是他们选择了ARM的硬件^収ͼStrongARM已经占据嵌入CPU市场77%的䆾额?<br />http://telecom.km169.net/data/200202/2610273001.htm <br /><br /><br /><br /><br /><br />SavaJe是几个世界大公司沃达丰、Orange和T-Mobile注资的公司,有强的后台Q前景应该不差。既然沃达丰、Orange和T-Mobile共同SavaJeQ相信这几个公司的手Z有相当大比例是用SavaJeQ?<br /><br /><br /><br /><br />q营商与手机厂商的大战会上演吗? <br /><br />6月底Q沃达丰联合世界q营商mmO2、NTT DoCoMo、Orange、TIM、T-Mobile和Telefonica{秘密聚会,接着抛出了一个名为OMTPQ开攄动终端^収ͼ的组l,最引h瞩目的是其对待设备商和运营商的不q等准入规则?<br /><br />OMTP 成立受益最大的是一家正处于谣言漩涡中的公?mdash;—SavaJeQ这家由沃达丰、Orange和T-Mobile注资的公总推出完全可定制的Z Java的手机操作系l而闻名。值得注意的是Q在OMTP成立的同Ӟ几家q营商都宣布了增资该公司的新闅R运营商是否要借SavaJel手机厂商施压? <br />http://www.tele.com.cn/article/list.asp?id=2586 <br /><br /><br /><br /><br /><br /><br /><br />LG 5月䆾手机销量创U录 <br /><br />  LG电子公司虽然是已l竞争相当激烈的手机市场上的新军Q但其表C,今年5月䆾的手机销量创下新U录Q主要是l和记黄埔公司的手机数量增加。根?Gartner研究公司的数据显C,LG是全球第六大手机刉商Q上个月销售出?20万部手机Q较?月䆾增加4.9%Q较之去q同期猛增了 98.4%?<br />http://www.comm9.com/sfnews/ztbd/200471313331.htm <br /><br /><br /><br /><br /><br /><br /><br />(BW)LG电子选择SavaJe的操作系l应用于下一代手?<br /><br />SavaJe与LG电子的伙伴关pȝ营运商带来新机遇Q给消费者带来新体验 <br />LG电子以及SavaJe Technologies今天宣布双方的合作关p,?005q开始将会把SavaJe OS(TM)QSavaJe 操作pȝ(TM)Q应用于2.5以及3G手机。不同于其他的手机操作系l,SavaJe OS提供完整的Java(R)环境Qؓ营运商、开发商以及他们的客h供最Z富、最具创新性以及最安全的用体验。详情将会在卛_于明q?月在戛纳召开?GSM世界大会上提供?<br />http://www.wx800.com/msg/2004/12/09/d71713.php <br /><br /><br /><br /><br /><br /><br />  日前Q沃达丰、Orange与日本NTT DoCoMo{世界顶U的Udq营商在伦敦建立了一个国际联盟,以驾驭未来的手机发展方向Qƈ推动手机游戏、视频等多方面的增g务?<br />因ؓq营商一直担心手机操作系l被微Y和诺Z投资的Symbian所垄断。该联盟已经启动了与Savaje Technologies公司的谈判,该公司股东包括沃达丰与OrangeQ主要致力于开发开攑ּ手机操作pȝ?<br />http://www.comm9.com/sfnews/ztbd/200471313331.htm <br /><br /><br /><br /><br /><br /><br /><br />另外从作Z息家电设备发展^台的角度来看Q一个简单且可跨各式CPUq_的操作系l,也是解决作法之一QJavaOS是一个这L典型Ҏ。目前例如像 SavaJe公司所发展Q预计于今年九月推出的SavaJe XE操作pȝQ就是一个可作ؓ?2MB内存?2MB RAM?90MHz以上32-bit Strong ARM-based的信息家电设备上之JavaOS操作pȝ。透过支持标准的Java执行环境Q以Java所开发的应用软g可直接于SavaJe XE上执行。除了上qCUY件作法外Q直接将Java技术做在芯片上Qƈ之作ؓ信息家电讑֤的核心,则是另一U解法。目前AJile 公司推出的aJ-100 single chip JVM芯片Q可以支持J2ME环境Q就是一个典型的范例?<br />http://www.cooltang.com/box/topic/character/program/cn-java/0505.htm <br />注:ARM的CPU直接支持bytecode。证据见NuclearJava.blogchina.com <br /><br /><br /><br /><br />至于SavaJe的实际市Z额及预测Qhttp://www.giichinese.com/chinese/ar23414_mobile_handsets_toc.html中有Q不q要交5Q0Q到Q7Q0元才能得到?<br /><br /><br /><br />有关SavaJe的技术信息见Q?<br />http://java.sun.com/features/2001/06/savaje.html <br />http://sunflash.sun.com/articles/40/3/ja/4013 <br /><br />*************************************** <br />**********W二个纯Java操作pȝ*********** <br />*************************************** <br />一个开源的JAVA操作pȝ <br />jNode: <br />Java New Operating System Design Effort <br /><br />http://jnode.sourceforge.net/portal/ <br />http://sourceforge.net/projects/jnode/ <br />JNode可能是现在开源的Java操作pȝ中发展最快的了?<br /><br />至于JNode的性能Q?<br />http://jnode.sourceforge.net/portal/node/51 <br />可以看到Q同L件中JNode的性能已经辑ֈ了SUN jdk1.4.2?10%Q用UJava写的Javaq_的底层的性能过了C++写的Javaq_底层Q?<br /><br />至于jdk1.4.2的性能是如何超qC++的,LNuclearJava.blogchina.com <br /><br /><br />它对jdk1.0已经几乎完全兼容Q对于jdk1.5兼容度不?0%?<br /><br />http://jnode.sourceforge.net/portal/node/174 <br /><br />大家可以下蝲ISO光盘镜像Q用VMware安装试试Q?<br />http://umn.dl.sourceforge.net/sourceforge/jnode/jnode-x86-0.1.9.iso.gz <br />镜像共有40多M <br /><br />JNode现在?.1.9版,正在向它的主要release?.2.0版进发?<br />一旦JNode发布Q就出C个非常恐怖的现像Q?<br />JNodeULCQ何一个不支持bytecode的CPU上只需要改动几Q的汇编代码p了?<br />也就是说JNode一旦发布就可以支持几乎所有的g体系 <br />http://www.koders.com/info.aspx?c=ProjectInfo&pid=ZK-Ps19mqSFzgjyC*FNiXw__ <br />jNode - <br /><br /><br /><br />*************************************** <br />**********W三个纯Java操作pȝ*********** <br />*************************************** <br />C代操作系lJavaOS <br />引言 <br />1997q??9?JavaSoft公布了JavaOS———为在微处理器上直接运行Java应用E序而设?<br />的一个高度精的操作系l?<br />http://bbs.xmu.edu.cn/bbsgcon?board=Java&file=G.863078295.A&num=4 <br /><br /><br /><br /><br /><br />*************************************** <br />**********W四个纯Java操作pȝ*********** <br />*************************************** <br />另一?00% UJava 操作pȝQ?<br />JXOSQ?<br />http://sourceforge.net/projects/jxos <br /><br /><br /><br /><br /><br /><br />*************************************** <br />**********W五个纯Java操作pȝ*********** <br />*************************************** <br />再来看看UJava操作pȝJX的情况: <br />http://www.embyte.com/shop_view.asp?id=23 <br /><br />只有Q0QO?<br /><br />JX可以装到一张Y盘中,可以启动电脑Q拥有图形界面,用这个启动L用DOS启动电脑好方便吧Q?<br /><br />q是JX启动后的抓屏Q?<br /><br />http://www.embyte.com/upload/product/a2004112080640.jpg <br /><br /><br />产品?<br /><br /><br /><br /><br /><br />JXZU纯Java操作pȝ,可以认ؓ是一U概忉|作系l?有兴参加JX开发的请和我联p? <br />yuanliao@hotmail.com每周五晚?:00,msn开展jx组讨论?<br /><br /><br />详细说明 <br /><br />如果x试一下目前JX的状?L <br /><br />http://www.embyte.com/upload/product/rawwritewin-0.7.zip <br /><br />工具?<br /><br />http://www.embyte.com/upload/product/jx-small.floppy <br />操作pȝimage写入一张Y?然后启动您的pc <br />您的pc需要如下硬仉|?一般普通PC都能够满?: <br />VESA BIOS 2.0 or greater <br />PS/2 mouse <br />128MB RAM <br /><br /><br /><br /><br /><br /><br /><br />摘要 <br /><br />q篇文章描述了JX操作pȝ的性能与体pȝ构。JX是一个用JAVA写的更有利于在其上开发JAVA应用E序的runtime操作pȝ。我们的工作表明?<br />JAVA开发一个操作系l是可能的,可以辑ֈ好的性能Q这得益于面向对象的软g技术和安全cd的编E语a。一个操作系l可以没有MMUg的保护也能做?<br />是安全的。JXZ一个小的微核(负责pȝ初始化)QCPU上下文开关程序,和低U的域保护管理。JAVA代码有组件构成,q些lg被装载到域里Q经q验 <br />证,译成本地码。域之间是相互隔ȝ?<br /><br />JX的体pȝ构允许多U系l配|,可以是速度较快的monolithicQ也可以是非常灵zM是相对较慢的配置。我们通过JX与LINUX的文件系l和 <br />NFS服务Q来Ҏ它们的性能。再讨论一下选择不同的系l配|时的性能效果。在monolithic的配|下QJX的文件性能可以辑ֈLINUX?0% <br />?0%QNFS可以辑ֈLINUX?0%?<br /><br />详细介绍L下文: <br />http://www.embyte.com/upload/down/JXjj.pdf <br />http://www.embyte.com/upload/down/JXsec.pdf <br /><br /><br /><br /><br /><br /><br /><br />*************************************** <br />**********W六个纯Java操作pȝ*********** <br />*************************************** <br />JOS <br />http://sourceforge.net/projects/jos <br /><br /><br /><br /><br /><br /><br />*************************************** <br />**********W七个纯Java操作pȝ*********** <br />*************************************** <br /><br />KaffeOS: A Java Operating System <br /><br />׃不太出名Q我׃详细说了Q大家自己查相关资料?<br />http://www.cs.utah.edu/research/factsheets/kaffeosscrn.pdf <br /><br /><br /><br /><br /><br />*************************************** <br />**********W八个纯Java操作pȝ*********** <br />*************************************** <br />leJOSQ?<br /><br />Tiny Java OS for Lego RCX brick. Like its predecessor TinyVM, has tiny Java runtime, under 32K; works as replacement firmware for Lego; Hitachi H8300 processor. To be ported to more small devices. [Open Source, Mozilla] <br />http://lejos.sourceforge.net/ <br /><br /><br /><br /><br />*************************************** <br />**********W九个纯Java操作pȝ*********** <br />*************************************** <br /><br />SanOS <br /><br />Minimal OS kernel for PC based server appliances. Lets you run java server applications without need to install host OS, only need normal Java HotSpot VM and Sanos. Description, documents, downloads, manifesto, links, contact. [Open Source, BSD] <br />http://www.jbox.dk/sanos/ <br /><br /><br /><br /><br /><br />*************************************** <br />**********W十个纯Java操作pȝ*********** <br />*************************************** <br />LogOS: <br />Linked object generation Operating System, and other Java on bare metal synthesis technology for embedded systems. Tools to make dynamic, classloadable programs without overhead of traditional OS and JVM software layers. <br />http://www.websprocket.com/ <br /><br /><br /><br /><br /><br /><br /><br />*************************************** <br />*********W十一个纯Java操作pȝ********** <br />*************************************** <br /><br />关于Java Card 上的java操作pȝQ?<br />http://www.gemplus.com/smart/rd/publications/pdf/Lag02gdc.pdf <br /><br /><br /><br /><br /><br /><br /><br /><br /><br />*************************************** <br />*********W十二个UJava操作pȝ********** <br />*************************************** <br />JBed <br /><br />a Java-based Real-Time Operating System <br />详细介绍见: <br />http://www.microjava.com/jvm/software/jit/jbed2?content_id=695 <br />JBed也是Q0Q%UJavaQ连驱动E序都是java写的 <br /><br /><br /><br /><br /><br /><br /><br /><br />*************************************** <br />*********W十三个UJava操作pȝ********** <br />*************************************** <br /><br />COSC <br /><br />Microkernel-Based Educational Operating System in Java <br />http://www.cosc.brocku.ca/Project/info/javaos.htm <br /><br /><br /><br /><br /><br />*************************************** <br />*********W十四个UJava操作pȝ********** <br />*************************************** <br />Janos <br /><br />Java-oriented Active Network Operating System <br />http://www.cs.utah.edu/flux/janos/</span><br /><img src ="http://www.tkk7.com/jackylpz/aggbug/39749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jackylpz/" target="_blank">q年</a> 2006-04-07 10:32 <a href="http://www.tkk7.com/jackylpz/archive/2006/04/07/39749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://abbobo.com" target="_blank">͵ԾƷʮ</a>| <a href="http://www8x5188x.com" target="_blank">4444޹˾Ʒ</a>| <a href="http://chiyizi.com" target="_blank">޾ƷGVͬ</a>| <a href="http://cfxzp.com" target="_blank">ĻӰԺww4164h</a>| <a href="http://hbjinmaitang.com" target="_blank">ŮƵ</a>| <a href="http://www-79983.com" target="_blank">ŮƵ</a>| <a href="http://wxyz2.com" target="_blank">456˳ӰԺ߹</a>| <a href="http://bixnu.com" target="_blank">պ޹Ƶ</a>| <a href="http://yakonet.com" target="_blank">׾ƷͼƬ</a>| <a href="http://qzapp88.com" target="_blank">ȫƵ߹ۿѸ嶯Ƶ</a>| <a href="http://avqvod.com" target="_blank">ձһ߶ </a>| <a href="http://bjsymsdwl.com" target="_blank">Ʒ߲ҳ</a>| <a href="http://k9l4.com" target="_blank">ѲƵ</a>| <a href="http://sijep.com" target="_blank">Ļ</a>| <a href="http://youkabaitiao.com" target="_blank">鶹˳Ƶ</a>| <a href="http://006dh.com" target="_blank">avƬvrһ</a>| <a href="http://kk600700.com" target="_blank">ۺ</a>| <a href="http://mtspvip.com" target="_blank">ɫַ߹ۿ</a>| <a href="http://wwwbu610.com" target="_blank">av뾫ƷװƬ</a>| <a href="http://ebhqd.com" target="_blank">ѹվ߹ۿ15</a>| <a href="http://yy468.com" target="_blank">޳վ</a>| <a href="http://pufenghotel.com" target="_blank">ѿijyellowƵ</a>| <a href="http://517qq.com" target="_blank">Ůžž</a>| <a href="http://3838dydy.com" target="_blank">޴߶ר</a>| <a href="http://778002.com" target="_blank">Ƶ</a>| <a href="http://sczxzt.com" target="_blank">˾Ʒŷ</a>| <a href="http://www04ggg.com" target="_blank">պ˳ۺձ</a>| <a href="http://b2bautoparts.com" target="_blank">ĻĴȫƵ</a>| <a href="http://beijinzhongliuyiyuan.com" target="_blank">˳ӰԺ߸</a>| <a href="http://hdznzdh.com" target="_blank">߹ۿƵ</a>| <a href="http://www33399.com" target="_blank">ssswwwձվƬ</a>| <a href="http://6006769.com" target="_blank">ްɫɫ߲</a>| <a href="http://appmofun.com" target="_blank">ѹۿƷ</a>| <a href="http://2002tw.com" target="_blank">ҹƷ߹ۿ</a>| <a href="http://bjfljg.com" target="_blank">޹˾þһ</a>| <a href="http://532342.com" target="_blank">þþƷ7777</a>| <a href="http://69xjk.com" target="_blank">ѸƵ</a>| <a href="http://luyifeile.com" target="_blank">ѾƷԲ߹ۿ </a>| <a href="http://jomashopcn.com" target="_blank">ŮˬƵѲ</a>| <a href="http://yjjinfeng.com" target="_blank">AVһþ</a>| <a href="http://b2b-chinese.com" target="_blank">97Ƶ˾Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>