Skip navigation.

王志军个人空间

工作、生活、健康

STICKY POST

2006年目标

Technorati Profile




Current Project:
1。〈4W家庭理财〉新增功能,详情请见4W家庭理财主页
2。修改<网络学院>;


Book to read:
1。<Borland传奇>;
2。<富爸爸穷爸爸系列>;
3。<谁动了我的奶酪>;
4。《设计模式》和《设计模式解析》
5。The Mythical Man-Month
6。http://my.opera.com/wangzhijun/blog/show.dml/122448

远期目标:
1。提高英语口语 --- http://www.unsv.comVOA Special TV, 更多网站
2。熟悉Oracle database concept和IAS、OCS;
3。熟悉J2EE和XML相关概念;
4。精通Linux;


软件测试网站:
1.Google testing
2.51testing


Future project:
1。将〈4W家庭理财〉移植到Linux下;
2。编写一个类似<良友.收藏家>但在Linux下运行的文档管理tool;
3。将在〈4W家庭理财〉功能基础上,编写一个面向小企业的共享财务软件,增加库存商品、人员管理、自动锁定等功能。


需要了解的概念:
Thread safe

设计软件,不一定遵循已有的规则,易用性和稳定性就是为用户着想,为用户着想的程序就是好程序,就会得到用户的欢迎,而不管你的算法多么优秀,你的函数写得多么完美,只要用户觉得不好用,用户不买你的帐,一切都是零。

----摘录自<我的软件10年:我的第一个商品化软件>

WebAii - tools for Ajax

URL: http://www.artoftest.com/Products.aspx


* IE/Firefox Browser Automation
o Rich, simple and easy to use API set
o Supports automating both Internet Explorer and Firefox using one consistent API and DOM.
o Control browser instances to do basic browser actions like GoBack, GoForward, Refresh ...etc.
o Supports automating multiple browser instances of the same or different types within the same test.

* Ajax Testing
o Rich support for defining and waiting on 1-N page changes for Ajax application testing.
o Supports both direct DOM actions and pure UI Mouse/Keyboard actions.
o High performance rich markup parser and .NET DOM implementation that provides a complete document object model accessible from your test code to navigate and inspect for easier and more comprehensive test verification.
o Perform pure UI actions using coordinate offsets easily. Again great for automating rich UI content like Flash plug-ins, image maps or DragDrop.

* ASP.NET Testing
o ASP.NET In-Process Host for fast browser-less without a webserver.
o Use ASP.NET Development Server (Cassini) to run your tests instead of IIS.
o New ASP.NET TestRegion custom control to use for designing testablility with TestRegions in your ASP.NET application. The control provides design-time visual rendering to easily visualize your TestRegions within the application on VS's design surface. At runtime the control renders as HTML comments.

* Rich and easy to use element identification methods
o Support for wide range of rules from XPath identification to basic name/id identification.
o Support for finding elements using element text content like (InnerText, InnerMarkup, OuterMarkup & StartTagContent. Use partial, literal or regexs text compare to define your search.
o Rich short-cut notation to easily define complex element identification. (i.e. use Find.ByAttribute(foo=~bar) with the '~' to signify partial value).
o Implements a new 'NodeIndexPath' identification that provides XPath like identification with lesser levels of markup dependency for more resilient automation.
o Provides chained identification to allow users to employ different identification methods within one search.
o Integrates TestRegions as identification reference points to produce resilient test beds that have lower cost of maintenance and ownership.
o Serialization/Deserialization of element identifications (FindParams) so you can separate test logic from application specifics. Define FindParams as XML files and have WebAii directly load them from file for your tests.

* JavaScript Unit Testing
o Support for calling JavaScript methods directly from your .NET code and logging from JavaScript directly into your test log. Use it to unit test your JavaScript.
o Support for invokation of JavaScript events directly on elements. Invoke onBlur/OnMouse out events ... etc.
o Enable logging directly from JavaScript. Use it to trace and perform error logging from your JavaScript. All logging is unified in one log.

* HTML Pop-ups, Dialogs & Win32 Windows Handling
o Support for both HTML pop-up dialogs and browser dialogs. WebAii comes with native support for Alert, Logon & FileUpload dialogs for both IE & Firefox in addition to an extensible framework to implement your own custom dialog handling for your custom dialogs.
o Win32 Windows support to help manage custom windows & basic Win32 window automation.

* Web Unit Testing Extensions
o Unit Testing extensions that target web testing scenarios for both NUnit & VS Team Test. The extensions introduce new test fixtures to allow you to share common elements definitions across tests and help structure your web testing better. Also the extensions provide dialog fixtures to help define the dialogs to handle for your test methods or across all tests.

* TestRegions
o Native Implementation of TestRegions to allow users to build highly resilient test automation and radically reduce maintenance costs and lower the total cost of ownership.

* Visual Capturing
o Capture browser screen shots for easy diagnosis of test failures.
o Capture specific elements on the page as bitmaps to use for visual verification.

* Visual Studio Team Test / NUnit Integration
o Tight integration with Visual Studio Team Suite unit testing framework. Unified logging with ready to use VS item templates.
o Tight integration with NUnit 2.4. Unified logging with ready to use VS item templates.

* Extensibility
o Pluggable logging that can be integrated into any automation system.
o Supports .NET configuration of its settings (using .config files) which allows tests to be re-configured without recompilation. For example, you can configure a test to run under InternetExplorer and then reconfigure to run against Firefox without a need to recompile the test.
o Built using Microsoft.NET framework and can easily be used in Microsoft Visual Studio and integrated in any .NET application using any .NET language." >

* Samples & Documentation
o Rich set of samples with 50 unit tests that cover most of the WebAii framework. Samples come as ready to use solutions you can open and start running tests. Solutions are provided for both NUnit or VS Team Test in both C# & VB.NET.
o Documentation and API references for the whole framework.

Selenium

Selenium Core is one of several ways you can use Selenium for browser automation. One of the easiest ways to get started is to use "Selenium IDE" to record a test and play it back. (At the time of this writing, May 2006, Selenium IDE only works in Firefox.)



http://wiki.javascud.org/display/SEL/Getting+Started+with+Selenium+Core

http://wiki.javascud.org/display/SEL/Selenium+Core+-+Wiki
http://wiki.javascud.org/display/SEL/Selenium+chinese+translation+road+map

AJAX and testing

产品要开始使用AJAX进行客户端显示,了解一下AJAX.不知道有哪些测试工具可以用来测试JavaScript?


What's AJAX?
Ajax stands for Asynchronous JavaScript and XML. In a nutshell, it is the use of the nonstandard XMLHttpRequest() object to communicate with server-side scripts. It can send as well as receive information in a variety of formats, including XML, HTML, and even text files. Ajax’s most appealing characteristic, however, is its “asynchronous” nature, which means it can do all of this without having to refresh the page. This allows you to update portions of a page based upon user events

The two features in question are that you can:
Make requests to the server without reloading the page
Parse and work with XML documents


From http://www1.ajaxtech.org/web/webres/ajaxtech/english/10004.htm AJAX:Getting Started

但确实是Garrett最早提出了这个好名字,否则我们就得啰啰嗦嗦地说上一大堆:异步(Asynchronous)、XMLHttpRequest、JavaScript、CSS、DOM等等。尽管原来把Ajax认为是Asynchronous JavaScript + XML(异步JavaScript + XML)的缩写,但如今,这个词的覆盖面有所扩展,把允许浏览器与服务器通信而无需刷新当前页面的技术都涵盖在内。



http://book.csdn.net/bookfiles/11/ Ajax基础教程

http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 简介
http://www.csdn.net/subject/ajax/ Ajax基础应用专题


只需从JsUnit网站(www.edwardh.com/jsunit/)下载JsUnit zip文件。把这个压缩文件解开,会得到一个jsunit文件夹,可以把Web服务器放在这里,这样整个团队或者整个组织就能更容易地使用JsUnit。JsUnit的大部分“核心”都在jsunit/app目录中,在这里可以看到jsUnitCore.js、jsUnitTracer.js和jsUnitTestManager.js,另外还有其他一些文件。如果你想运行具体的JsUnit测试,可以使用testRunner.html来运行jsunit/tests目录中找到的任何测试页。如果你在使用IntelliJ,而且想具体使用JsUnit,jsunit/intellij目录中包含了需要的所有适当文件。参见JsUnit网站(www.edwardh.com/jsunit/)




Selenium可以在所有主要浏览器上运行,而且可以在常用的操作系统上运行。类似于JsUnit,Selenium测试也在浏览器上运行,因此非常适合测试系统功能和浏览器兼容性。要了解更多的有关内容,请参见selenium.thoughtworks.com/index.html




HttpUnit是用Java编写的,可以用来模拟浏览器。利用HttpUnit,能模拟提交一个表单,测试请求返回的页面,并检查基本JavaScript。一般地,你可能会结合使用HttpUnit和JUnit。HttpUnit有一个很有意思的特性,它能模拟特定的浏览器,因此你可以测试任何特定于浏览器的逻辑。
在HttpUnit之上还建立了基于Java的jWebUnit。基本说来,jWebUnit大大简化了导航规则,并提供了一些预置的断言。这个工具同样要与JUnit结合使用。JUnit再向前一步是验收测试框架FitNesse,这是Object Mentor的一些人写的。FitNesse之所以独树一帜,是因为你的客户可以使用这个框架定义应用应该做什么。你(甚至你的客户)可以创建输入表,并指定运行应用的期望结果。正如你所料,成功的测试会有绿的结果,失败则显示红色。FitNesse是xUnit测试的一个补充,Object Mentor有一个精辟的说法:xUnit可以确保你正确地建立了代码,而FitNesse可以确保你建立了正确的代码!




HtmlUnit类似于HttpUnit,不过它对页面建模,而不像HttpUnit那样对请求和响应建模。HtmlUnit模拟了浏览器,并与JUnit结合使用。

PL/SQL issues

when loading procedure/function,

SQL> CREATE OR REPLACE PROCEDURE compute_intensive_program
Warning: Procedure created with compilation errors.
SQL> SHOW ERRORS -- show the details of error message

if Oracle reports ``error PLS-00103'', you should type:
oerr PLS 00103

when error "PLS-00201: identifier 'DBMS_LOCK' must be declared" occurs, you may grant privilege to the specific user/public.
SQL> grant execute on dbms_lock to luser; -- schema who owns procedure
or
SQL> grant execute on dbms_lock to public;

相关链接:
http://w2.syronex.com/jmr/edu/db/introduction-to-plsql/
http://www.oracle.com/technology/oramag/oracle/06-jul/o46plsql.html

http://www.orafaq.com/forum/t/65567/0/

project scheduling tool - GanttProject

今天淘到一个项目管理的好东东 -GanttProject,比MS Project小(安装文件只有8.5M),容易使用,open source and free.

With GanttProject you can break down your project into a tree of tasks and assign human resources that have to work on each task. You can also establish dependencies between tasks, like "this task can't start until this one is finished". GanttProject renders your project using two charts: Gantt chart for tasks and resource load chart for resources. You may print your charts, generate PDF and HTML reports, exchange data with Microsoft(R) Project(TM) and spreadsheet applications.



GanttProject Screenshot

单元测试利器 JUnit 4

URL: http://www.ibm.com/developerworks/cn/java/j-lo-junit4/index.html?S_TACT=105AGX52&S_CMP=techcsdn

推荐 JUnit Recipes - J.B.Rainsberger,很详细的一本书。介绍了很多scenarios,实用。

http://www.junit.org/
http://www.junit.org/news/article/index.htm - JUnit articles
http://junit.sourceforge.net/doc/faq/faq.htm
http://www.instrumentalservices.com/index.php?option=com_content&task=view&id=45&Itemid=52 - JUnit 4.0 in 10 minutes
http://www-128.ibm.com/developerworks/java/library/j-junit4.html - An early look at JUnit 4


单元测试工具:Kent Beck 和 Erich Gamma 的Junit, Artima SuiteRunner, Cedric Beust 的 TestNG

http://www.ibm.com/developerworks/cn/java/j-junit4.html JUnit 4 抢先看

http://www.ibm.com/developerworks/cn/java/j-ant/ “利用 Ant 和 JUnit 进行增量开发”(Malcolm Davis,developerWorks,2000 年 11 月):探讨了单元测试的优势,具体使用了 Ant 和 JUnit,并有示例代码。

http://www.pragmaticprogrammer.com/starter_kit/utj/index.html Pragmatic Unit Testing in Java with JUnit (Andy Hunt 和 Dave Thomas,Pragmatic Programmers,2003 年):非常好地介绍了单元测试。

http://www.amazon.com/exec/obidos/ISBN=1932394230/ref=nosim/cafeaulaitA/ JUnit Recipes: Practical Methods for Programmer Testing (J. B. Rainsberger,Manning,2004 年):一本最广泛地引用和参考了 JUnit 的书籍。

http://www.ibm.com/developerworks/cn/java/j-cq08296/ 追求代码质量: JUnit 4 与 TestNG 的对比

http://www.ibm.com/developerworks/cn/java/j-cq/ 追求代码质量

http://www.ibm.com/developerworks/cn/java/j-testng TestNG 使 Java 单元测试轻而易举”(Filippo Diotalevi,developerWorks,2005 年 1 月):介绍了 TestNG。

http://www.beust.com/testng/ TestNG:Cedric Beust 的框架,基于现在用于 JUnit 4 中的测试样式,最先使用了注释。

http://www.ibm.com/developerworks/cn/java/j-xp042203/ “揭开极端编程的神秘面纱: 测试驱动的编程”(Roy Miller,developerWorks,2003 年 4 月):找出测试驱动的编程可以如何提高程序员的生产效率和质量,并学习编写测试的机制。

http://www.ibm.com/developerworks/cn/java/j-cobertura/ “用 Cobertura 测量测试覆盖率”(Elliotte Rusty Harold,developerWorks,2005 年 5 月):学习用这个方便的开放源码工具来识别未测试的代码和查找 bug。

bat 批处理命令 文件 类型 语法 格式 应用 详解(转)

URL: http://www.boofee.net/bigfee/read.php?94

  大一的时候看了篇关于如何书写bat文件的文章。那时候看得很仔细,大概都看懂了。不过都2年了,基本上没有碰过bat文件,所以忘的都差不多了。今天是离家前的倒数第二个晚上了,突然想重温下bat文件的语法,格式,所以网上找了些资料来,研究研究,把我看懂的东西尽量写的白话一点,人人能看懂.希望能和看这篇文章的人一起学习进步.

  大家知不知道默认共享这回事?这东西用不着的地方可就不是好东西了.所以就要删掉.但这东西是每次系统重起后都会重新创建的.所以每次都要重新打开cmd 重新删掉一下.极为麻烦.但有了批处理文件就不一样了,先把命令输入到批处理文件中,然后加入到启动项中,每次启动就会自动运行,免去了每次输入命令的麻烦.至于怎么写这个批处理文件嘛,到文章的结尾我会告诉大家的,但不知道在我写完之前会不会睡着呢?~

  如何创建批处理文件?

    不要听了批处理文件就感到很神气,其实这东西很简单的.你用过记事本没有?用过? 好的.将记事本打开,什么都不用写,然后选择文件,保存.保存类型选择所有文件,文件名则命名为 *.bat 这个*代表是文件名,你可以随便的起.保存好之后,看看你保存的地方,会出现一个白色窗口里有个黄色齿轮的图标.这东西就是你创建的批处理文件,双击他就可以运行,但他现在由于里面没有输入任何命令,所以他运行了并不会做任何事情.当我们想往这个*.bat文件中添加东西时,只要右键选择他,然后选择编辑,就可以打开记事本往内输入命令了.

  批处理文件中的命令是什么?

  批处理文件中的命令暂时先可以理解为dos命令,等稍后深入理解了以后再进行解释.批处理顾名思义就是一大堆东西堆在一起处理.换句话说就是往里面写一条条dos命令,然后按顺序挨个执行,效果跟你在cmd里敲dos命令是一个效果.只不过用批处理写好之后,要运行只要双击下就可以运行了.而不用再一遍一遍的重复的往里面打命令.这就是批处理文件的好处.

  除了运行dos命令之外,他还可以支持选择结构if,循环结构for,goto等,与c有点类似,但远没有c全面,并且编写语言十分不规范.

  批处理语法:

先讲个最基本的东西 @echo off

  echo的意思是回旋,这里的意思就是回显,echo off意思就是关闭回显.前面的@表示echo off 这一行也不会回显你可以试着去掉@和整行去掉.@的另一个功能是在执行完批处理文件时自动恢复命令回显。如果第一句用的是ECHO OFF,那么在执行完批处理文件以后不会显示命令提示符。

举个例子:如果我们先创建一个1.bat文件,往里面输入:

dir 然后保存在c:\下.然后我们运行cmd,进入c盘根目录下,输入1.bat,则显示:
C:\>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 0C5D-07FF

 C:\ 的目录

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

...........

C:\

如果将1.bat内容修改成

echo off

dir

然后再在cmd里输入1.bat,则会显示
C:\>echo off       //因为运行了echo off,所以没有显示dir命令,直接显示了结果
 驱动器 C 中的卷没有标签。
 卷的序列号是 0C5D-07FF

 C:\ 的目录

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

.....

C:\

如果将1.bat文件修改成:

@echo off
dir

则显示成:
C:\>1.bat         //与前面不同,并没有显示echo off,原因是加了@,所以不显示@后面的内容.又因为加

        //了echo off,所以后面的命令不显示,直接显示结果
 驱动器 C 中的卷没有标签。
 卷的序列号是 0C5D-07FF

 C:\ 的目录

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

....

C:\

通过以上的比较,相信你对echo off命令已经充分掌握了.现在已经1点了...写得累啊!!!洗澡睡觉去了

----------------------

早晨6点就被拉起来了...我命苦啊,那么继续写吧

----------------------

接下来讲的是call命令:

call 是打电话的call,而不是"喔靠"的靠:).call的意思为调用.假如有2个批处理文件a.bat和b.bat.如果我想运行a.bat的当中运行 b.bat.如何运行呢?其实很简单,只要在a.bat文件中输入call命令,则可以在a.bat运行的当中,运行b.bat,等b.bat运行完之后,继续执行a.bat

call命令格式:

CALL [drive:][path]filename [batch-parameters]

batch-parameters 指定批处理程序所需的命令行信息。

举例如下,我们在c盘根目录下创建a.bat文件,内容为:

echo this is a.bat

call d:\b.bat

echo done

然后在d盘根目录下创建b.bat,内容为:

echo this is b.bat

保存后,打开cmd,进入c盘根目录,然后输入1.bat,显示如下:
C:\>a.bat

C:\>echo this is a.bat
this is a.bat

C:\>call d:\b.bat

C:\>echo this is b.bat
this is b.bat

C:\>echo done
done

由例子很容易看出来,是先运行a.bat的内容,直到遇到call b.bat后,则调用b.bat,运行完b.bat后,再返回a.bat接着运行call b.bat后面的echo done语句,直至将a.bat的所有批处理命令运行完.

注:里面有个[batch-parameters]里面的所指的参数是什么,知道的朋友能否告知,不胜感激.

PAUSE 命令

暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处理程序中使用该命令。

rem命令:

表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释).

同时你可以用两个冒号来替代rem.如: ::等同于一个rem.但他们有个区别,就是用::作注释的话他是不回显的,即使你打echo on强制回显也没有同的.同时rem可以在config.sys中加注释.

语法: rem[commnet]

批处理文件参数:

有点变成基础的人都知道函数有参数.批处理文件也有参数.

我打个比方,希望能帮助没有语言基础的人也能看的非常明白. 

我从例子里开始吧.首先在c盘根目录下创建一个批处理文件 a.bat,里面输入内容

echo %1

然后打开cmd,然后进入c盘根目录.输入:a "this is a canshu"

得到结果如下:
C:\>a.bat "this is a test"

C:\>echo "this is a test"
"this is a test"

  输入的a "this is a canshu"中,a为新建的a.bat的文件名a(后面的.bat可写也可不写),而a后面的 "this is a canshu"这句话就是参数,写在这的参数,在程序运行中就将参数自动放到批处理程序中去.那么放在什么位置呢?就是放在 %1的地方.

  看了例子,让我们看看整个关于参数的定义如何:

  批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符"%"。
  %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。//我们上个程序的例子里就有%1,他就是参数,而输入中"this is a test"作为参数就直接放到%1的位置,于是程序就变成了 echo "this is a test".

  再举几个例子帮助你理解:

C:根目录下一批处理文件名为b.bat,内容为:
@echo off
type %1     //type为dos中的输出命令,可以用来输出文本文件的内容,比如我们新建一个1.txt文件

         //里面输入内容,保存.进cmd,如果输入1.txt则看不了1.txt文件内容,但是如果我

         //想看怎么办呢?这时候可以用type命令,只要在cmd里输入type 1.txt就能显示

         //1.txt文件中的内容了 
type %2

那么运行C:\>b a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt

于是上面的批处理命令就变成了
@echo off

type a.txt

type b.txt

于是上面的命令将顺序地显示a.txt和b.txt文件的内容。

没有编程基础的人可能要问,干什么要弄个参数啊?在后面加个参数多麻烦啊?直接往里面写不就好了啊?!其实这样想有对的方面也有错的方面.还是举个例子说明吧.

第一步还是在c盘根目录下新建一个批处理文件,我们取名仍为a.bat.往里面的内容输入为:

ping %1  //ping命令可以简单理解为测试一台机器开着还是没有开,如果开着的话,他就回给你回送回应.

然后进cmd,我们想测试下163的服务器是不是开着,则输入a www.163.com

  对于知道ping命令的人,可以打ping进行检查,但如果想ping的人不知道ping命令怎么用,那怎么办啊?这时候你就可以把命令预先输入到批处理文件中,保存好,然后让不会用的人进cmd,运行你的批处理文件,文件名后面加上他要ping 的网站地址就行了.换句话说,他想ping 163就直接加163的网址,想ping sina就直接加sina的网址.这样只要输入一个参数,而不用改程序本身,整个程序的通用性就大大提高了.

  这是对于一个简单的ping命令,你或许觉得用参数不值得,还是直接改不就好了啊.但如果程序有很多条,你一下找不到在哪改怎么办啊?所以,不管你是菜哥,菜弟,菜姐,菜妹,只要运行下,输入参数,结果自己就会出来,不用再象你一样,考虑怎么编写批处理文件.人家只要知道是输入什么东西能让批处理程序运行,而编写的人则想的是如何让不懂程序的人能运行程序.

  批处理参数就这么简单,不知道你理解了没有?但如果你想深一步了解批处理参数,可以接着往下看,如果不想深入了解,知道现在这么多也就够了.

以下粉红色内容为网上资料.

====================================

  因为参数只有1%-9%,但当我们要引用第十个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下:

初始状态, cmd 为命令名, 可以用 %0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 
 ^     ^       ^     ^      ^      ^      ^      ^      ^      ^
 &line;       &line;        &line;      &line;        &line;       &line;       &line;        &line;       &line;       &line;
%0  %1    %2   %3   %4   %5   %6    %7   %8   %9

经过1次shift后, cmd 将无法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
 ^     ^       ^     ^      ^      ^      ^      ^      ^      ^
 &line;       &line;        &line;      &line;        &line;       &line;       &line;        &line;       &line;       &line;
%0  %1    %2   %3   %4   %5   %6    %7   %8   %9

经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 
 ^     ^       ^     ^      ^      ^      ^      ^      ^      ^
 &line;       &line;        &line;      &line;        &line;       &line;       &line;        &line;       &line;       &line;
%0  %1    %2   %3   %4   %5   %6    %7   %8   %9

遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针.
=================

if goto choice for高级语法

今天就写到这吧,我收拾收拾东西准备滚蛋回学校了.可能if goto choice for高级语法要在沈阳才能完成了,祝我好运吧.

======================

学校的"网吧"终于算重新开张了,抓紧时间把剩下的写完

if命令

说得通俗点,if就相当于我们白话里的如果.

举个例子:如果a喜欢b,那么a就要娶b. 这句话翻译成计算机语言就成了

if a喜欢b a就要娶b.

当然拉,计算机不可能理解a喜欢b,a就要娶b这两句话,这里只是举个例子让你方便理解.

if语句一共有3种模式,如下:


IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
IF [NOT] ERRORLEVEL number command

 NOT 指定只有条件为 false 的情况下, Windows XP 才应该执行该命令。

 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。

 string1==string2 如果指定的文字字符串匹配,指定条件为 true。

 EXIST filename 如果指定的文件名存在,指定条件为 true。

 command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟一个执行 ELSE关键字后的命令的 ELSE 命令。

我们先讲解第一种:

IF [NOT] string1==string2 command

自然语句意思:如果string1==string2,那么执行command

下面再举个能实际应用的if语句.

自然语句:如果输入的参数为3,那么显示"a=3"

计算机语句:

@echo off
if "%1"=="3" echo "a=3"

或者写成

@echo off
if %1==3 echo "a=3"

注意:当要测试的时候,因在cmd底下,输入1.bat 3.因为这里用了是传递参数,具体看文章前部分"批处理文件参数".

第二种:

IF [NOT] EXIST filename command

这条命令用语检测文件是否存在.如果存在,执行command.如果不存在,则什么也不显示.

如:我们想检查e盘根目录下是否有一个叫2.txt的文件.如果存在,则显示exist.如果不存在,则什么也不显示.

批处理命令如下:

@echo off
if exist e:\2.txt echo "exist 2.txt"

第三种:

IF [NOT] ERRORLEVEL number command

这个我引用点资料,感觉别人写得更详细,引用部分为粉色字部分:

if errorlevel <数字> 待执行的命令

很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

如if errorlevel 2 goto x2

==== 注 ===========
返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式:

if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...

当然, 也可以使用以下循环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e //此处为一个for循环,后面会继续                        介绍到的,看不懂可以先跳过去

if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码.

另外, 虽然 if errorlevel=<数字> command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了

choice命令

????

goto命令

for命令

for命令其实就是一个循环命令,如果我们想重复一个语句,就可以用for命令.通过for命令,可以控制循环的次数等.

语法:

FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

  不知道你你看懂了没有,其实还是很容易理解的,还是举个例子吧.我想用type打印所有c盘根目录下的bat文件和txt文件.dos底下命令就是 type *.bat *.txt.先将该文件保存在c盘根目录下,名称为a.bat

用for命令如下:

for %%t in (*.bat *.txt) do type %%t

%%t其实就是代表的一个参数,他的内容在in() 里面括号里的内容.也就是说这句话里的%%t就变成了*.bat *.txt了.do就是做的意思,执行type命令,而type后面是%%t,而%%t又是*.bat *.txt.所以原来这句命令的意思就变成了:

type *.bat *.txt

执行时进cmd,然后到c盘根目录下输入a.bat就可以打印出c盘根目录下所有扩展名为.bat和.txt的文件内容了.

这里要注意:in后面有个空格.

在xp底下,for命令扩展名被起用因此for的功能变得更加强大.下面讲一个真正的循环.


FOR /L %variable IN (start,step,end) DO command [command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)

里面第一个1在start的位置,意思是起始位置,第2个1在step位置,英文意思是跨步,在这里面的意思是每次增量为1.后面的5在end的位置,意思是结束时的大小.

这句话的意思就是从1(start)开始增加,每次增加1(step),一直到变到5(end)为止.

这个有什么用呢?其实我感觉这个东西的用处还是很大的.举个最简单的例子,我们想重复回显"i am the best"这句话,重复显示10遍.那么for命令如下:

for /L %%e in (1,1,10) do echo "i am the best"

这时,cmd就会重复输入"i am the best"10遍.

===============================================

看完整篇文章了吗?咳...我写的不容易啊....

现在不知道你对bat有了什么样的理解,我现在的感觉就是bat就是dos命令的组合,你把dos命令全写进bat命令,只要运行下bat就会挨个执行dos命令,这无疑提供了不少的方便。

下面我再举些实例.

删除默认共享:

对于默认共享不知道你了解多少,反正留着是个隐患,现在唯一的办法好象只能做个bat文件进行删除.命令如下:

net share ipc$ /delete
net share admin$ /delete
net share c$ /delete
net share d$ /delete
net share e$ /delete

……

里面的c d e为你的盘符。如果你只有一个分区,那么写到net share c$ /delete为止就可以了。如果你有n个分区,那么就挨个写下去。

net share d$ /delete
net share e$ /delete

net share f$ /delete

net share g$ /delete……

登陆到局域网的机器快捷方式(对方机器有密码且为2000或以上系统)

net use \\192.168.0.1 [密码] /user:[用户名]
explorer \\192.168.0.1

bat文件备份注册表
set regfile=%date%   //设置变量,下面出现%regfile%的都自动替换“当天date”

if exist "%regfile%" goto end   //如果发现当天date命名的目录,跳到文件尾。
md temp       //建temp目录


call 1.bat      //调用1.bat
del  1.bat         
ren 2.bat 1.bat
ren 3.bat 2.bat
ren 4.bat 3.bat
echo move  "%regfile%"  temp >4.bat  //写 移动“当天date命名的目录”到temp的bat文件  。

md "%regfile%"   //建当天date命名的目录
cd "%regfile%"  //进入

reg export hkcu hkcu.reg   //导出注册表
reg export hklm hklm.reg  
                              //HKEY_CURRENT_USER  缩写hkcu 。存放当前用户个人数据
                              //HKEY_LOCAL_MACHINE  缩写hklm 。系统的核心数据
cd..
deltree /y  temp >nul        ////返回上级目录  ,删temp文件夹
:end


---
Goto在批处理程序中,将 Windows XP 导入到由标签标识的行。找到标签后,程序将处理从下一行开始的命令。

语法
goto label

参数
label
指定所要转向的批处理程序中的行。
/?
在命令提示符显示帮助。
注释
使用命令扩展
如果启用了命令扩展(即默认状态),并且使用带有目标标签为 :EOF 的 goto 命令,则可以在不定义标签的情况下将控制传送到当前批处理脚本文件的末端,然后退出批处理脚本文件。使用 goto 和 :EOF 标签时,必须在标签前插入冒号。例如:

goto :EOF

有关使该功能有用的 call 命令的信息,请参阅相关主题中的 cmd。

使用有效的 label 值
可以在 label 参数中使用空格,但不得包括其他分隔符(例如分号或等号)。goto 命令只使用标签的前八个字符。例如,下面的标签是等效的,且都将解析为 :hithere0:

:hithere0

:hithere01

:hithere02

将 label 参数与批处理程序中的标签进行匹配
所指定的 label 值必须与批处理程序中的标签匹配。批处理程序中的标签必须以冒号 (:smile: 开始。Windows XP 可以识别以冒号 (:smile: 开头作为标签的批处理程序行并且不会将它作为命令处理。如果某行以冒号开始,则该行的任何命令都将被忽略。如果批处理程序没有包含指定的标签,则批处理程序将停止并显示以下消息:

Label not found

对条件操作使用 goto
可以将 goto命令 与其他命令一起使用,从而执行条件操作。有关使用 goto命令 执行条件操作的详细信息,请参阅“相关主题”中的 if。

范例
以下批处理程序在驱动器 A 将一张磁盘格式化为系统盘。如果操作成功,则 goto 命令会将 Windows XP 导向 :end 标签:

echo off
format a:/s
if not errorlevel 1 goto end
echo An error occurred during formatting.
:end
echo End of batch program.

相关链接:
http://www.chinabyte.com/160/1922160.shtml
http://www.faqs.org/docs/abs/HTML/dosbatch.html
http://bbs.supernic.cn/redirect.php?tid=2184&goto=lastpost
http://edu.stuccess.com/knowcenter/DOS/dosProgram/00000012.htm

【心得】必学的Linux系统安全命令

URL:http://www.caomeng.com/read.php?tid-871-page-e-fpage-7.html

1. 作用

更改一个或多个文件或目录的属主和属组。使用权限是超级用户。

2.格式

chown [选项] 用户或组 文件

3.主要参数

--dereference:受影响的是符号链接所指示的对象,而非符号链接本身。

-h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。

--from=目前所有者:目前组只当每个文件的所有者和组符合选项所指定的,才会更改所有者和组。其中一个可以省略,这已省略的属性就不需要符合原有的属性。

-f, --silent, --quiet:去除大部分的错误信息。

-R, --recursive:递归处理所有的文件及子目录。

-v, --verbose:处理任何文件都会显示信息。
4.说明

chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。

5.应用实例

1.把文件shiyan.c的所有者改为wan

$ chown wan shiyan.c

2.把目录/hi及其下的所有文件和子目录的属主改成wan,属组改成users。

$ chown - R wan.users /hi

chattr

1.作用

修改ext2和ext3文件系统属性(attribute),使用权限超级用户。

2.格式

chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录

3.主要参数

-R:递归处理所有的文件及子目录。

-V:详细显示修改内容,并打印输出。

-:失效属性。

+:激活属性。

= :指定属性。

A:Atime,告诉系统不要修改对这个文件的最后访问时间。

S:Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。

a:Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。

i:Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。

D:检查压缩文件中的错误。

d:No dump,在进行文件系统备份时,dump程序将忽略这个文件。

C:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。

:Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。

u:Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。

4.说明

chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。

5.应用实例

1.恢复/root目录,即子目录的所有文件

# chattr -R +u/root

2.用chattr命令防止系统中某个关键文件被修改

在Linux下,有些配置文件(passwd ,fatab)是不允许任何人修改的,为了防止被误删除或修改,可以设定该文件的“不可修改位(immutable)”,命令如下:

# chattr +i /etc/fstab

sudo

1.作用

udo是一种以限制配置文件中的命令为基础,在有限时间内给用户使用,并且记录到日志中的命令,权限是所有用户。

2.格式

sudo [-bhHpV] [-s <shell>] [-u <用户>] [指令]
sudo [-klv]


3.主要参数

-b:在后台执行命令。
-h:显示帮助。
-H:将HOME环境变量设为新身份的HOME环境变量。
-k:结束密码的有效期,即下次将需要输入密码。
-l:列出当前用户可以使用的命令。
-p:改变询问密码的提示符号。
-s <shell>:执行指定的Shell。
-u <用户>:以指定的用户为新身份,不使用时默认为root。
-v:延长密码有效期5分钟。


4.说明

udo命令的配置在/etc/sudoers文件中。当用户使用sudo时,需要输入口令以验证使用者身份。随后的一段时间内可以使用定义好的命令,当使用配置文件中没有的命令时,将会有报警的记录。sudo是系统管理员用来允许某些用户以root身份运行部分/全部系统命令的程序。一个明显的用途是增强了站点的安全性,如果需要每天以超级用户的身份做一些日常工作,经常执行一些固定的几个只有超级用户身份才能执行的命令,那么用sudo是非常适合的。

ps

1.作用

显示瞬间进程 (process) 的动态,使用权限是所有使用者。

2.格式

[options] [--help]

3.主要参数

该命令的参数非常多, 此出仅列出几个常用的参数。

-A:列出所有的进程。
-l:显示长列表。
-m:显示内存信息。
-w:显示加宽可以显示较多的信息。
-e:显示所有进程。
a:显示终端上的所有进程,包括其它用户的进程。
-au:显示较详细的信息。
-aux:显示所有包含其它使用者的进程。

4.说明

要对进程进行监测和控制,首先要了解当前进程的情况,也就是需要查看当前进程。ps命令就是最基本、也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行、运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。下面给出了ps-aux命令详解。大部分信息都可以通过执行该命令得到。最常用的三个参数是u、a、x。下面就结合这三个参数详细说明ps命令的作用:ps aux

USER表示进程拥有者;PID表示进程标示符;%CPU表示占用的CPU使用率;%MEM占用的物理内存使用率;VSZ表示占用的虚拟内存大小;RSS为进程占用的物理内存值;TTY为终端的次要装置号码。 STAT表示进程的状态,其中D为不可中断的静止(I/O动作);R正在执行中;S静止状态;T暂停执行;Z不存在,但暂时无法消除;W没有足够的内存分页可分配;高优先序的进程;N低优先序的进程;L有内存分页分配并锁在内存体内 (实时系统或 I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是所执行的指令。

4.应用实例

在进行系统维护时,经常会出现内存使用量惊人,而又不知道是哪一个进程占用了大量进程的情况。除了可以使用top命令查看内存使用情况之外,还可以使用下面的命令:

aux | sort +5n

who

1.作用

who显示系统中有哪些用户登陆系统,显示的资料包含了使用者ID、使用的登陆终端、上线时间、呆滞时间、CPU占用,以及做了些什么。 使用权限为所有用户。

2.格式

who - [husfV] [user]

3.主要参数

-h:不要显示标题列。
-u:不要显示使用者的动作/工作。
-s:使用简短的格式来显示。
-f:不要显示使用者的上线位置。
-V:显示程序版本。

4.说明

该命令主要用于查看当前在线上的用户情况。如果用户想和其它用户建立即时通信,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。


动手练习

1.使用Linux命令检测系统入侵者

安装过Mandrake Linux和Red Hat Linux的用户都会知道,Linux系统会内置三种不同级别(标准、高、更高)的防火墙,当进行了Linux服务器的安装和一些基本的设置后,服务器应该说是比较安全的,但是也会有黑客通过各种方法利用系统管理员的疏忽侵入系统。如何快速查找黑客非常重要。一般来说,可以使用命令查询黑客是否入侵,见表1。

表1 查询黑客入侵现象的命令对应表
黑客入侵现象 对应命令
处于混杂模式的网卡接口 ipconfig
不能解释的CPU活动 top ps
频繁的网络使用 netstat na
磁盘空间急剧减少 df du
日志文件丢失 cat syslog
其他网络管理员的通知 mail
没有权限的新用户 who
陌生的进程 top ps

举例说明,如果黑客嗅探网络,那么它必须使网卡接口处于混杂模式,使用下面命令进行查询:

#ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:00:E8:A0:25:86
inet addr:192.168.1.7 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING PROMISCUOUS MTU:1500 Metric:1
......


从这个命令的输出中,可以看到上面讲到的这些概念。第一行的00:00:E8:A0:25:86是mac地址,第二行的192.168.1.7是IP地址,第四行讲的是接收数据状态,这时正在被黑客嗅探。一般而言,网卡有几种接收数据帧的状态,如Broadcast、Multicast、Promiscuous等。Broadcast是指接收所有类型为广播报文的数据帧;Multicast是指接收特定的组播报文;Promiscuous则是通常说的混杂模式,是指对报文中的目的硬件地址不加任何检查、全部接收的工作模式。

2.限制su命令的滥用

我们知道,超级用户在Linux中有最大的权利,几乎所有黑客都想得到这个目标。Linux可以增加对切换到超级用户的限制。使用PAM(Pluggable Authentication Modules)可以禁止除在wheel组以外的任何人su成root,修改/etc/pam.d/su文件,除去屏蔽标识#。使用/usr/sbin/usermod G10 bjecadm将bjecadm这个账号加入gid为10的组,就是wheel组。命令如下:

/etc/pam.d/su # 使用密码验证#
auth sufficient /lib/security/pam_wheel.so debug
# 限制只有wheel组用户才可以切换到root#
auth required /lib/security/pam_wheel.so use_uid
chmod -G10 bjecadm

另外,每当用户试图使用su命令进入系统用户时,命令将在/usr/adm/sulog文件中写一条信息,若该文件记录了大量试图用su进入root的无效操作信息,则表明了可能有人企图破译root口令。

Linux命令有着强大的功能。对于Linux系统管理员来说,往往只需要通过各种安全命令技巧,组合构成安全防线。从计算机安全的角度看,世界上没有绝对安全的计算机系统,Linux系统也不例外。

JAVA 正则表达式实现

URL: http://www.javasalon.net/java/src/pages/3/1120_1012475928.htm

偶尔搜到的东东,不记得是那位的Bolg了。很不错的文章。。。。
§1黑暗岁月
有一个String,如何查询其中是否有y和f字符?最黑暗的办法就是:
程序1:我知道if、for语句和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);
}
}
好像很直观,但这种方式难以应付复杂的工作。如查询一段文字中,是否有is?是否有thing或ting等。这是一个讨厌的工作。
§2 Java的java.util.regex包
按照面向对象的思路,把希望查询的字符串如is、thing或ting封装成一个对象,以这个对象作为模板去匹配一段文字,就更加自然了。作为模板的那个东西就是下面要讨论的正则表达式。先不考虑那么复杂,看一个例子:
程序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。如果想在查找时忽略大小写,则可以写成:
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
虽然暂时不知道Pattern(模板、模式)和Matcher(匹配器)的细节,程序的感觉就比较爽,如果先查询is、后来又要查询thing或ting,我们只需要修改一下模板Pattern,而不是考虑if语句和for语句,或者通过charAt()。
1、写一个特殊的字符串??正则表达式如a|f。
2、将正则表达式编译成一个模板:p
3、用模板p去匹配字符串str。
思路清楚了,现在看Java是如何处理的(Java程序员直到JDK1.4才能使用这些类。
§3 Pattern类与查找
①public final class java.util.regex.Pattern是正则表达式编译后的表达法。下面的语句将创建一个Pattern对象并赋值给句柄p:Pattern p=Pattern.compile(regEx);
有趣的是,Pattern类是final类,而且它的构造器是private。也许有人告诉你一些设计模式的东西,或者你自己查有关资料。这里的结论是:Pattern类不能被继承,我们不能通过new创建Pattern类的对象。
因此在Pattern类中,提供了2个重载的静态方法,其返回值是Pattern对象(的引用)。如:
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
当然,我们可以声明Pattern类的句柄,如Pattern p=null;
②p.matcher(str)表示以用模板p去生成一个字符串str的匹配器,它的返回值是一个Matcher类的引用,为什么要这个东西呢?按照自然的想法,返回一个boolean值不行吗?
我们可以简单的使用如下方法:
boolean result=Pattern.compile(regEx).matcher(str).find();
呵呵,其实是三个语句合并的无句柄方式。无句柄常常不是好方式。后面再学习Matcher类吧。先看看regEx??这个怪咚咚。
§4 正则表达式之限定符
正则表达式(Regular Expression)是一种生成字符串的字符串。晕吧。比如说,String regEx="me+";这里字符串me+ 能够生成的字符串是:me、mee、meee、meeeeeeeeee等等,一个正则表达式可能生成无穷的字符串,所以我们不可能(有必要吗?)输出正则表达式产生的所有东西。
反过来考虑,对于字符串:me、mee、meee、meeeeeeeeee等等,我们能否有一种语言去描述它们呢?显然,正则表达式语言是这种语言,它是一些字符串的模式??简洁而深刻的描述。
我们使用正则表达式,用于字符串查找、匹配、指定字符串替换、字符串分割等等目的。

生成字符串的字符串??正则表达式,真有些复杂,因为我们希望由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)描述任意的字符串,而且要准确。
先搞几个正则表达式例子:
程序3:我们总用这个程序测试正则表达式。
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*"结果如何?
②"ab+"??能匹配ab、abb、abbb……。等价于"abb*"。问题regEx="or+"结果如何?
③"or?"??能匹配o和or。? 表示前面字符可以有零次或一次。
这些限定符*、+、?方便地表示了其前面字符(子串)出现的次数(我们用{}来描述):
x* 零次或多次 ≡{0,}
x+ 一次或多次 ≡{1,}
x? 零次或一次 ≡{0,1}
x{n} n次(n>0)
x{n,m} 最少n次至最多m次(0<n<m)
x{n,} 最少n次,

现在我们知道了连续字符串的查找、匹配。下面的是一些练习题:
①查找粗体字符串(不要求精确或要求精确匹配),写出其正则表达式:
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}



②正则表达式匹配字符串,输出是什么?
§5替换(删除)、Matcher类
现在我们可能厌烦了true/false,我们看看替换。如把book,google替换成bak(这个文件后缀名,在EditPlus中还行)、look或goooogle。
程序4:字符串的替换。
import java.util.regex.*;
class Regex1{
public static void main(String args[]) {
String regEx="a+";//表示一个或多个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);
}
}
这个程序与前面的程序的区别,在于使用了m.replaceAll(String)方法。看来Matcher类还有点用处。
① public final class Matcher 是一个匹配器。可以把他看成一个人,一手拿着模子(Pattern类的对象),一手拿着一个字符序列(CharSequence),通过解释该模子而对字符序列进行匹配操作(match operations)。常常我们这样编程:“喂,模子p,你和字符串str一起创建一个匹配器对象”。即 Matcher m=p.matcher(str);
② m可以进行一些操作,如public String replaceAll(String replacement),它以replacement替换所有匹配的字符串。
§6正则表达式之特殊字符
我们熟悉这样一个字符串"\n" 如:System.out.print(s+"\nbbb");这是Java中常用的转移字符之一。其实转移字符就是一种正则表达式,它使用了特殊字符 \ 。

下面是正则表达式中常用的特殊字符:
匹配次数符号 * + ? {n}、{n,}、{n,m}
“或”符号 | 程序2已经使用过了
句点符号 . 句点符号匹配所有字符(一个),包括空格、Tab字符甚至换行符。
方括号 [ ] 仅仅匹配方括号其中的字符)
圆括号 () 分组,圆括号中的字符视为一个整体。
连字符 - 表示一个范围。
“否”符号 ^ 表示不希望被匹配的字符(排除)
我们一下子学不了太多的东西,这不是正则表达式的全部内容和用法。但已经够我们忙活的了。我们用程序4 验证。(⊙⊙表示替换的字符)
① regEx为下列字符串时,能够表示什么?
regEx 匹配 测试用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表示?
测试用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 结果ccbcca(如何与上面的合并)



注:
1、String str="一本书中的tan、ten、tin和ton";
输出: 一本书中的⊙⊙、⊙⊙、⊙⊙和⊙⊙
2、String str=" abcaccbcbaacabccaa "; 输出:ccbcca
程序5:if、for语句和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 开始
好像我们知道了一些正则表达式与 Java的知识,事实上,我们才刚刚开始。这里列出我们知道的东西,也说一点我们不知道的东西。
① Java 在JDK1.4引入了(java.util.regex包)以支持正则表达式,包中有两个类,分别是Pattern和Matcher。它们都有很多的方法,我们还不知道。String类中的split、matches方法等等也使用到了正则表达式。StringTokenizer是否没有用处了?
② 正则表达式是一门语言。有许多正则表达式语法、选项和特殊字符,在Pattern.java源文件中大家可以查看。可能比想象中的要复杂。系统学习正则表达式的历史、语法、全部特殊字符(相当于Java中的关键字的地位),组合逻辑是下一步的事情。
③ 正则表达式是文本处理的重要技术,在Perl、PHP、Python、JavaScript、Java、C#中被广泛支持。被列为“保证你现在和未来不失业的十种关键技术”,呵呵,信不信由你


相关链接:
http://dev.csdn.net/develop/article/83/83039.shtm
http://www.regular-expressions.info/java.html ****
http://java.sun.com/docs/books/tutorial/essential/regex/ ***
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
http://irw.ncit.edu.tw/peterju/webslide/re/ **
http://soft.yesky.com/lesson/211/2350711.shtml **
http://www.regexlab.com/zh/regref.htm
http://www.cs.princeton.edu/introcs/72regular/
http://jspwiki.org/wiki/JavaRegularExpressions#section-JavaRegularExpressions-BackslashesEscapesAndQuoting
http://java.sun.com/developer/technicalArticles/releases/1.4regex/
http://hi.baidu.com/bestwisheslhl/blog/item/6e27e21f2fda52f5e1fe0bd9.html ***
http://hi.baidu.com/personnel/blog/item/6ac534a8ac7ef2b1ca130c23.html ***