??xml version="1.0" encoding="utf-8" standalone="yes"?>美国职业棒球比分数据:BlogJava-紫蝶∏飛揚↗-文章分类 - 棒球比分大小怎么算|վ//www.355548.live/algz/category/41401.htmlPurple Butterfly Flying QQ?7101519 Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts //algz.googlecode.com/svn/trunk/zh-cnMon, 21 Apr 2014 14:31:21 GMTMon, 21 Apr 2014 14:31:21 GMT60Java发送httph (get ?postҎh) - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/412732.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 21 Apr 2014 05:24:00 GMT//www.355548.live/algz/articles/412732.html//www.355548.live/algz/comments/412732.html//www.355548.live/algz/articles/412732.html#Feedback0//www.355548.live/algz/comments/commentRss/412732.html//www.355548.live/algz/services/trackbacks/412732.html阅读全文

紫蝶∏飛揚↗ 2014-04-21 13:24 发表评论
]]>
JAVA语言___文g下蝲功能模板. - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/396077.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 05 Mar 2013 06:11:00 GMT//www.355548.live/algz/articles/396077.html//www.355548.live/algz/comments/396077.html//www.355548.live/algz/articles/396077.html#Feedback0//www.355548.live/algz/comments/commentRss/396077.html//www.355548.live/algz/services/trackbacks/396077.htmlJS:
{
text : '下蝲导入模板',
iconCls : 'Import',
handler : function() {
window.location.href="../BuinessPlanDownloadServlet";
}
}
java:
package com.sysware.customize.hd.investment.productionMaterialsManagement.buinessPlan;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BuinessPlanDownServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String filePath = request.getSession().getServletContext().getRealPath("")+ File.separator+ "template.files"+ File.separator+ "buinessPlanDown" + File.separator + "buinessPlanTempl.xls";
response.reset();
response.setCharacterEncoding("UTF-8");
File file = new File(filePath);
if (!file.exists()) {
PrintWriter out = response.getWriter();
out.print("{failure:true}");
return;
}
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes("gb2312"), "iso8859-1"));
ServletOutputStream out = response.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
BufferedOutputStream bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.flush();
bos.close();
}
}
}


紫蝶∏飛揚↗ 2013-03-05 14:11 发表评论
]]>
q接字符串代?写的不错) - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/366904.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 21 Dec 2011 02:01:00 GMT//www.355548.live/algz/articles/366904.html//www.355548.live/algz/comments/366904.html//www.355548.live/algz/articles/366904.html#Feedback0//www.355548.live/algz/comments/commentRss/366904.html//www.355548.live/algz/services/trackbacks/366904.html    public static String join(Object array[], String separator)
    {
        if(array == null)
            return null;
        if(separator == null)
            separator = "";
        int arraySize = array.length;
        int bufSize = arraySize != 0 ? arraySize * ((array[0] != null ? array[0].toString().length() : 16) + (separator == null ? 0 : separator.length())) : 0;
        StringBuffer buf = new StringBuffer(bufSize);
        for(int i = 0; i < arraySize; i++)
        {
            if(separator != null && i > 0)
                buf.append(separator);
            if(array[i] != null)
                buf.append(array[i]);
        }

        return buf.toString();
    }


紫蝶∏飛揚↗ 2011-12-21 10:01 发表评论
]]>
使用Arrays.asLisvt()后调用add 报异?java.lang.UnsupportedOperationException at java.ut - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/347399.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 31 Mar 2011 08:05:00 GMT//www.355548.live/algz/articles/347399.html//www.355548.live/algz/comments/347399.html//www.355548.live/algz/articles/347399.html#Feedback0//www.355548.live/algz/comments/commentRss/347399.html//www.355548.live/algz/services/trackbacks/347399.html常常使用Arrays.asLisvt()后调用addQremoveq些method时出现java.lang.UnsupportedOperationException异常。这是由于:

Arrays.asLisvt() q回java.util.Arrays$ArrayListQ??span style="color: #339966">不是ArrayList?span style="color: #339966">Arrays$ArrayList和ArrayList都是l承AbstractListQremoveQadd{?method在AbstractList中是默认throw UnsupportedOperationException而且不作M操作。ArrayList overrideq些method来对listq行操作Q但是Arrays$ArrayList没有override remove(int)Qadd(int){,所以throw UnsupportedOperationException?

解决Ҏ是用IteratorQ或者{换ؓArrayList
List list = Arrays.asList(a[]);
List arrayList = new ArrayList(list);



紫蝶∏飛揚↗ 2011-03-31 16:05 发表评论
]]>
数组如何转换成ArrayList - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/347072.html紫蝶∏飛揚↗紫蝶∏飛揚↗Sat, 26 Mar 2011 15:08:00 GMT//www.355548.live/algz/articles/347072.html//www.355548.live/algz/comments/347072.html//www.355548.live/algz/articles/347072.html#Feedback0//www.355548.live/algz/comments/commentRss/347072.html//www.355548.live/algz/services/trackbacks/347072.htmlimport java.util.Arrays;
import java.util.List;

。。。。。?/span>

String[]   s={a,b,c,......} 
List   temp   =   Arrays.asList(s);//即temp:ArrayList



紫蝶∏飛揚↗ 2011-03-26 23:08 发表评论
]]>
使用JAVA发送mailӞL报错 - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/346495.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 17 Mar 2011 13:29:00 GMT//www.355548.live/algz/articles/346495.html//www.355548.live/algz/comments/346495.html//www.355548.live/algz/articles/346495.html#Feedback0//www.355548.live/algz/comments/commentRss/346495.html//www.355548.live/algz/services/trackbacks/346495.html1. Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

 

2. NoClassDefFoundError: com/sun/activation/registries/LogSupport

 

3.Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream

在用JAVA发送mailӞL报错?br /> 解决办法:
(1)把JAVAEE5.0换成j2ee1.4可以解决q个问题?br /> (2)把javaee.jar里面关于activation和jmail有关的文件删除。这是因为javaee5.0lib和jmail.jar 有冲H造成Q?

紫蝶∏飛揚↗ 2011-03-17 21:29 发表评论
]]>
linux上安装websphere6.1不弹出安装界?/title><link>//www.355548.live/algz/articles/346162.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Sun, 13 Mar 2011 12:39:00 GMT</pubDate><guid>//www.355548.live/algz/articles/346162.html</guid><wfw:comment>//www.355548.live/algz/comments/346162.html</wfw:comment><comments>//www.355548.live/algz/articles/346162.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/346162.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/346162.html</trackback:ping><description><![CDATA[<p>?在linux上安装websphere6.1Q运行install时没有Q何反应,不弹出安装界面?br /> {:linux自动安装时少装了一个包Q?nbsp;  <br /> compat-libstdc++-33-3.2.3-61.i386.rpm <br /> 装好后,在运行installQ安装界面出来,能正常安装?/p> <img src ="//www.355548.live/algz/aggbug/346162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-03-13 20:39 <a href="//www.355548.live/algz/articles/346162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>websphere控制C启动/停止IBM HTTP SERVER服务报错 - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/346062.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 10 Mar 2011 02:59:00 GMT//www.355548.live/algz/articles/346062.html//www.355548.live/algz/comments/346062.html//www.355548.live/algz/articles/346062.html#Feedback0//www.355548.live/algz/comments/commentRss/346062.html//www.355548.live/algz/services/trackbacks/346062.htmlwebsphere中启?停止IBM HTTP SERVER服务报错:

无法q接到节?ALGZNode01/webserver1 上的 IBM HTTP Administration 服务器?/p>

 

原因: IBM HTTP Administration 服务器没有启?

 



紫蝶∏飛揚↗ 2011-03-10 10:59 发表评论
]]>
RBACZ角色的访问控ӞRole-Based Access ControlQ?/title><link>//www.355548.live/algz/articles/344009.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 10 Feb 2011 02:29:00 GMT</pubDate><guid>//www.355548.live/algz/articles/344009.html</guid><wfw:comment>//www.355548.live/algz/comments/344009.html</wfw:comment><comments>//www.355548.live/algz/articles/344009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/344009.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/344009.html</trackback:ping><description><![CDATA[<p>        Z角色的访问控ӞRole-Based Access ControlQ作Zl访问控Ӟ自主讉KQ强制访问)的有前景的代替受到广泛的x。在RBAC中,权限与角色相兌Q用户通过成ؓ适当角色的成员而得到这些角色的权限。这极大地化了权限的管理。在一个组l中Q角色是Z完成各种工作而创造,用户则依据它的责d资格来被指派相应的角Ԍ用户可以很容易地从一个角色被指派到另一个角艌Ӏ角色可依新的需求和pȝ的合q而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关pd以徏立v来以囊括更广泛的客观情况?/p> RBAC认ؓ权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就?#8220;Who对What(Which)q行How的操?#8221;?  <br /> WhoQ权限的拥用者或MQ如Principal、User、Group、Role、Actor{等Q?  <br /> WhatQ权限针对的对象或资源(Resource、ClassQ?  <br /> HowQ具体的权限QPrivilege,正向授权与负向授权)?  OperatorQ操作。表明对What的How操作。也是Privilege+Resource   <br /> RoleQ角Ԍ一定数量的权限的集合。权限分配的单位与蝲?目的是隔User与Privilege的逻辑关系.   <br /> GroupQ用LQ权限分配的单位与蝲体。权限不考虑分配l特定的用户而给l。组可以包括l?以实现权限的l承)Q也可以包含用户Q组内用L承组的权     限。User与Group是多对多的关pRGroup可以层次化,以满不同层U权限控制的要求?  <br /> RBAC的关注点在于Role和User, Permission的关pR称为User assignment(UA)和Permission assignment(PA).关系的左右两辚w是Many-to-Many关系。就是user可以有多个roleQrole可以包括多个user?  <br /> 凡是用过RDBMS都知道,n:m 的关p需要一个中间表来保存两个表的关pR这UA和PAq当于中间表。事实上Q整个RBAC都是Z关系模型?  Session在RBAC中是比较隐晦的一个元素。标准上_每个Session是一个映,一个用户到多个role的映。当一个用hzM所有角色的一个子集的时候,建立一个session。每个Session和单个的user兌Qƈ且每个User可以兌C或多个Session.   <br /> 在RBACpȝ中,User实际上是在扮演角?Role)Q可以用Actor来取代UserQ这个想法来自于Business Modeling With UML一书Actor-Role模式。考虑到多人可以有相同权限QRBAC引入了Group的概cGroup同样也看作是Actor。而User的概念就兯C个h?  <br /> q里的Group和GBACQGroup-Based Access ControlQ中的GroupQ组Q不同。GBAC多用于操作系l中。其中的Group直接和权限相兌Q实际上RBAC也借鉴了一些GBAC的概c?  <br /> Group和User都和l织机构有关Q但不是l织机构。二者在概念上是不同的。组l机构是物理存在的公司结构的抽象模型Q包括部门,人,职位{等Q而权限模型是Ҏ象概忉|q。组l结构一般用Martin fowler的Party或责L式来建模?  <br /> Party模式中的Person和User的关p,是每个Person可以对应C个UserQ但可能不是所有的User都有对应的Person。Party中的部门Department或组lOrganizationQ都可以对应到Group。反之Group未必对应一个实际的机构。例如,可以有副l理q个GroupQ这是多人有相同职责?  <br /> 引入Groupq个概念Q除了用来解军_人相同角色问题外Q还用以解决l织机构的另一U授权问题:例如QA部门的新L希望所有的A部门的h都能看。有了这样一个A部门对应的GroupQ就可直接授权给q个Group? <img src ="//www.355548.live/algz/aggbug/344009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-02-10 10:29 <a href="//www.355548.live/algz/articles/344009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM4J 知识详解 - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/338767.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 23 Nov 2010 03:35:00 GMT//www.355548.live/algz/articles/338767.html//www.355548.live/algz/comments/338767.html//www.355548.live/algz/articles/338767.html#Feedback0//www.355548.live/algz/comments/commentRss/338767.html//www.355548.live/algz/services/trackbacks/338767.html一.Document对象,三种创徏Ҏ

1.dXML文g,获得document对象.
            SAXReader reader = new SAXReader();
            Document  document = reader.read(new File("input.xml"));

2.解析XML格式的字W串,获得document对象.
            String text = "<members></members>";
            Document document = DocumentHelper.parseText(text);
3.创徏documentI对?/span>.
            Document document = DocumentHelper.createDocument();
            Element  root = document.addElement("members");// 创徏根节?只有IDOCUMENT对象才能创徏ROOTl点


?节点控制

1.获取文?span style="color: #99cc00">根节?/span>.
           Element   root = document.getRootElement();
2.取得节点的文?br />            String text=memberElm.getText();
也可以用Q?br />            String text=root.elementText("name");   //q个是取得根节点下的name字节点的文字;可以cLM节点下的文本
3.讄节点文字.
           ageElm.setText("29");
4.父节点下获得单个子节点对?/span>.
           Element memberElm=root.element("member");  // "member"是节点名

5.取得父节点下遍历名ؓ"member"的所有子节点.
           List nodes = rootElm.elements("member");
           for (Iterator it = nodes.iterator(); it.hasNext();) {
                 Element elm = (Element) it.next();
                 // do something
            }
6.父节点下?span style="color: #99cc00">遍历所有子节点q行.
            for(Iterator it=root.elementIterator();it.hasNext();){
                Element element = (Element) it.next();
                // do something
            }
7.父节点下d子节?/span>.
           Element ageElm = newMemberElm.addElement("age");

8.父节点下删除子节?/span>.
           parentElm.remove(childElm);// childElm是待删除的节?parentElm是其父节?br />
?属性相?
1.取得某节点下的某属?br />             Element root=document.getRootElement();   
            Attribute attribute=root.attribute("size");// 属性名name
2.取得属性的文字
            String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");q个是取得根节点下name字节点的属性firstname的?

3.遍历某节点的所有属?br />             Element root=document.getRootElement();   
            for(Iterator it=root.attributeIterator();it.hasNext();){
                Attribute attribute = (Attribute) it.next();
                String text=attribute.getText();
                System.out.println(text);
            }
4.讄某节点的属性和文字.
newMemberElm.addAttribute("name", "sitinspring");
5.讄属性的文字
            Attribute attribute=root.attribute("name");
            attribute.setText("sitinspring");
6.删除某属?br />             Attribute attribute=root.attribute("size");// 属性名name
            root.remove(attribute);
?文?写入XML文g.
1.文中全?不设|编?直接写入的Ş?
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文中含有中?讄~码格式写入的Ş?
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("GBK");    // 指定XML~码       
            XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
           
            writer.write(document);
            writer.close();
?字符串与XML的{?br /> 1.字W串转化为XML
String text = "<members> <member>sitinspring</member> </members>";
Document document = DocumentHelper.parseText(text);
2.文?或节点的XML转化为字W串.
            SAXReader reader = new SAXReader();
            Document  document = reader.read(new File("input.xml"));           
            Element root=document.getRootElement();               
            String docXmlText=document.asXML();
            String rootXmlText=root.asXML();
            Element memberElm=root.element("member");
            String memberXmlText=memberElm.asXML();
?使用XPath快速找到节?
d的XML文CZ
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
  <name>MemberManagement</name>
  <comment></comment>
  <projects>
    <project>PRJ1</project>
    <project>PRJ2</project>
    <project>PRJ3</project>
    <project>PRJ4</project>
  </projects>
  <buildSpec>
    <buildCommand>
      <name>org.eclipse.jdt.core.javabuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
  </buildSpec>
  <natures>
    <nature>org.eclipse.jdt.core.javanature</nature>
  </natures>
</projectDescription>

使用XPath快速找到节点project.
 public static void main(String[] args){
    SAXReader reader = new SAXReader();
   
    try{
      Document  doc = reader.read(new File("sample.xml"));
     
      List projects=doc.selectNodes("/projectDescription/projects/project");
     //Element nodes0=xmlDoc.selectSingleNode("/bookstore"); //采用相对路径,卛_前结?包括当前l点)开始查?与下列结果相?
     //Element nodes=nodes0.selectNodes("book");      ////采用l对路径,卛_前结?包括当前l点)开始查?
     //XPATH语法详见: //www.w3school.com.cn/xpath/xpath_syntax.asp


      Iterator it=projects.iterator();
     
      while(it.hasNext()){
        Element elm=(Element)it.next();      
        System.out.println(elm.getText());
      }
     
    }
    catch(Exception ex){
       ex.printStackTrace();
    }
  }



紫蝶∏飛揚↗ 2010-11-23 11:35 发表评论
]]>
Class.forName的作用以及ؓ什么要用它【{? - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/325802.html紫蝶∏飛揚↗紫蝶∏飛揚↗Sun, 11 Jul 2010 11:22:00 GMT//www.355548.live/algz/articles/325802.html//www.355548.live/algz/comments/325802.html//www.355548.live/algz/articles/325802.html#Feedback0//www.355548.live/algz/comments/commentRss/325802.html//www.355548.live/algz/services/trackbacks/325802.htmlClass.forName(xxx.xx.xx) q回的是一个类

首先你要明白在java里面Mclass都要装蝲在虚拟机上才能运行。这句话是装蝲cȝ?和new 不一P要分清楚)?

至于什么时候用Q你可以考虑一下这个问题,l你一个字W串变量Q它代表一个类的包名和cdQ你怎么实例化它Q只有你提到的这个方法了Q不q要再加一炏V?
A a = (A)Class.forName("pacage.A").newInstance();
q和?
A a = new A()Q?
是一L效果?

关于补充的问?
{案是肯定的Qjvm会执行静态代码段Q你要记住一个概念,静态代码是和classl定的,class装蝲成功pC执行了你的静态代码了。而且以后不会再走q段静态代码了?/p>

Class.forName(xxx.xx.xx) q回的是一个类
Class.forName(xxx.xx.xx);的作用是要求JVM查找q加载指定的c,也就是说JVM会执行该cȝ静态代码段

动态加载和创徏Class 对象Q比如想Ҏ用户输入的字W串来创建对?
String str = 用户输入的字W串
Class t = Class.forName(str);
t.newInstance();

 在初始化一个类Q生成一个实例的时候,newInstance()Ҏ和new关键字除了一个是ҎQ一个是关键字外Q最主要有什么区别?它们的区别在于创建对象的方式不一P前者是使用cd载机Ӟ后者是创徏一个新cR那么ؓ什么会有两U创建对象方式?q主要考虑到Y件的可׾~、可扩展和可重用{Y件设计思想?

Java中工厂模式经怋用newInstance()Ҏ来创建对象,因此从ؓ什么要使用工厂模式上可以找到具体答案?例如Q?
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式Q?
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

q一步可以写成如下Ş式:
String className = readfromXMlConfig;//从xml 配置文g中获得字W串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称Q它的优ҎQ无论ExamplecL么变化Q上qC码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……Q只要他们承ExampleInterface可以?

从JVM的角度看Q我们用关键字new创徏一个类的时候,q个cd以没有被加蝲。但是用newInstance()Ҏ的时候,必M证:1、这个类已经加蝲Q?、这个类已经q接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,q个静态方法调用了启动cd载器Q即加蝲java API的那个加载器?

现在可以看出QnewInstance()实际上是把newq个方式分解Z步,即首先调用Class加蝲Ҏ加蝲某个c,然后实例化?q样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灉|性,提供l了一U降耦的手段?

最后用最单的描述来区分new关键字和newInstance()Ҏ的区别:
newInstance: q型。低效率。只能调用无参构造?
new: 强类型。相寚w效。能调用Mpublic构造?/p>

文章出处QDIY部落(//www.diybl.com/course/3_program/java/javajs/20090215/155546.html)



紫蝶∏飛揚↗ 2010-07-11 19:22 发表评论
]]>
Java 日期旉 Datecd,longcd,Stringcd表现形式的{?/title><link>//www.355548.live/algz/articles/324727.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 29 Jun 2010 01:17:00 GMT</pubDate><guid>//www.355548.live/algz/articles/324727.html</guid><wfw:comment>//www.355548.live/algz/comments/324727.html</wfw:comment><comments>//www.355548.live/algz/articles/324727.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/324727.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/324727.html</trackback:ping><description><![CDATA[<p>1、java.util.Datecd转换成longcd<br /> java.util.Date dt = new Date();<br /> System.out.println(dt.toString());   //java.util.Date的含?br /> long lSysTime1 = dt.getTime() / 1000;   //得到U数QDatecd的getTime()q回毫秒?br /> <br /> 2、由longcd转换成Datecd<br /> SimpleDateFormat sdf= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");<br /> //前面的lSysTime是秒敎ͼ先乘1000得到毫秒敎ͼ再{为java.util.Datecd<br /> java.util.Date dt = new Date(lSysTime1 * 1000);  <br /> String sDateTime = <span style="color: #339966">sdf.format(dt);</span>  //得到_到秒的表C:08/31/2006 21:08:00<br /> System.out.println(sDateTime);<br />  <br /> 3?08/31/2006 21:08:00"格式的String转换java.util.Datecd<br /> String sDt = "08/31/2006 21:08:00";<br /> SimpleDateFormat sdf= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");<br /> <span style="color: #339966">Date dt2 = sdf.parse(sDt);<br /> </span>//l箋转换得到U数的long?br /> long lTime = dt2.getTime() / 1000;<br />  <br />  <br /> //注意HH与hh含认不同QHH表示?4时制取Qhh表示?2时制取<br /> 常用的格式的含义Q摘自JdkQ注意大写的含义通常是不同的Q?br /> 字母    含义                            CZ<br /> y    Year                             1996;96             哪一q?br /> M   Month in year  J              uly;Jul;07           一q中的哪一?br /> m   Minute in hour                 30                    一个小时中的第几分?br /> w   Week in year                   27                   一q中的第几个星期<br /> W   Week in month                 2                    一个月中的W几个星?br /> D    Day in year                     189                 一q中的第几天<br /> d    Day in month                   10                  一个月中的W几?br /> H    Hour in day (0-23)            0                   一天中的第几个时Q?4时Ӟ<br /> h    Hour in am/pm (1-12)        12                  一天中上午、下午的W几个小Ӟ12时Ӟ<br /> S    Millisecond                      978                 毫秒?br /> s    Second in minute              55                  一分钟的第几秒<br />  <br /> 4、系l当前时?br /> long lSysTime2 = System.currentTimeMillis();   //得到毫秒表示的系l当前时?/p> <img src ="//www.355548.live/algz/aggbug/324727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2010-06-29 09:17 <a href="//www.355548.live/algz/articles/324727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java.util.Collections c?/title><link>//www.355548.live/algz/articles/321301.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 18 May 2010 09:45:00 GMT</pubDate><guid>//www.355548.live/algz/articles/321301.html</guid><wfw:comment>//www.355548.live/algz/comments/321301.html</wfw:comment><comments>//www.355548.live/algz/articles/321301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/321301.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/321301.html</trackback:ping><description><![CDATA[1. 描述Q?<br /> 1.1 概述 <br /> java.util.Collectionsc:“包含可以操作或返回集合的专用静态类?nbsp;<br /> 1.2 所含方?<br /> Iterator, ArrayList, Elements, Buffer, Map,Collections <br /> <br /> 列子Q?<br /> import java.util.ArrayList; <br /> import java.util.Collection; <br /> import java.util.Collections; <br /> import java.util.Comparator; <br /> import java.util.List; <br /> <br /> public class CollectionsSort { <br /> public CollectionsSort() { <br /> <br /> } <br /> <br /> public static void main(String[] args) { <br /> double array[] = {111, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> List li = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> //list.add(""+array[i]); <br /> } <br /> double arr[] = {111}; <br /> for(int j=0;j<arr.length;j++){ <br /> li.add(new Double(arr[j])); <br /> } <br /> } <br /> <br /> 2. 具体操作 <br /> <span style="color: #33cccc"><span style="color: #339966"><span style="color: #99cc00">1) 排序(Sort) </span><br /> </span></span>使用sortҎ可以Ҏ元素的自焉?Ҏ定列表按升序q行排序。列表中的所有元素都必须实现 Comparable 接口。此列表内的所有元素都必须是用指定比较器可相互比较的 <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections.sort(list); <br /> for (int i = 0; i < array.length; i++) { <br />    System.out.println(li.get(i)); <br /> }  <br /> //l果Q?12,111,23,456,231 <br /> <span style="color: #99cc00">2) hQShufflingQ?/span> <br /> h法所做的正好?sort 相反: 以随机的方式排列 List 中元素?<br /> Collections.Shuffling(list) <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections.shuffle(list); <br /> for (int i = 0; i < array.length; i++) { <br />    System.out.println(li.get(i)); <br /> } <br /> //l果Q?12,111,23,456,231 <br /> 3) 反{(Reverse) <br />        使用ReverseҎ可以Ҏ元素的自焉?Ҏ定列表按降序q行排序?<br /> Collections.reverse(list) <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections. reverse (list); <br /> for (int i = 0; i < array.length; i++) { <br />    System.out.println(li.get(i)); <br /> } <br /> //l果Q?31,456,23,111,112 <br /> <br /> 4) 替换所有的元素(Fill) <br /> 使用指定元素替换指定列表中的所有元素?<br /> String str[] = {"dd","aa","bb","cc","ee"}; <br /> for(int j=0;j<str.length;j++){ <br /> li.add(new String(str[j])); <br /> } <br /> Collections.fill(li,"aaa"); <br /> for (int i = 0; i < li.size(); i++) { <br /> System.out.println("list[" + i + "]=" + li.get(i)); <br /> <br /> } <br /> //l果Qaaa,aaa,aaa,aaa,aaa <br /> <br /> 5) 拯(Copy) <br /> 用两个参敎ͼ一个目?List 和一个源 List, 源的元素拷贝到目标Qƈ覆盖它的内容。目?List 臛_与源一样长。如果它更长Q则在目?List 中的剩余元素不受影响?<br /> Collections.copy(list,li): 后面一个参数是目标列表 ,前一个是源列?<br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> List li = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> double arr[] = {1131,333}; <br /> String str[] = {"dd","aa","bb","cc","ee"}; <br /> for(int j=0;j<arr.length;j++){ <br /> li.add(new Double(arr[j])); <br /> } <br /> Collections.copy(list,li); <br /> for (int i = 0; i <list.size(); i++) { <br /> System.out.println("list[" + i + "]=" + list.get(i)); <br /> } <br /> //l果Q?131,333,23,456,231 <br /> <br /> 6) q回Collections中最元?min) <br /> Ҏ指定比较器生的序Q返回给?collection 的最元素。collection 中的所有元素都必须是通过指定比较器可怺比较?<br /> Collections.min(list) <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections.min(list); <br /> for (int i = 0; i <list.size(); i++) { <br /> System.out.println("list[" + i + "]=" + list.get(i)); <br /> } <br /> //l果Q?3 <br /> <br /> 7) q回Collections中最元?max) <br /> Ҏ指定比较器生的序Q返回给?collection 的最大元素。collection 中的所有元素都必须是通过指定比较器可怺比较?<br /> Collections.max(list) <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections.max(list); <br /> for (int i = 0; i <list.size(); i++) { <br /> System.out.println("list[" + i + "]=" + list.get(i)); <br /> } <br /> //l果Q?56 <br /> <br /> 8) lastIndexOfSubList <br /> q回指定源列表中最后一ơ出现指定目标列表的起始位置 <br /> int count = Collections.lastIndexOfSubList(list,li); <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> List li = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> double arr[] = {111}; <br /> String str[] = {"dd","aa","bb","cc","ee"}; <br /> for(int j=0;j<arr.length;j++){ <br /> li.add(new Double(arr[j])); <br /> } <br /> Int locations = Collections. lastIndexOfSubList (list,li); <br /> System.out.println(“===”+ locations); <br /> //l果 3 <br /> <br /> 9) IndexOfSubList <br /> q回指定源列表中W一ơ出现指定目标列表的起始位置 <br /> int count = Collections.indexOfSubList(list,li); <br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> List li = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> double arr[] = {111}; <br /> String str[] = {"dd","aa","bb","cc","ee"}; <br /> for(int j=0;j<arr.length;j++){ <br /> li.add(new Double(arr[j])); <br /> } <br /> Int locations = Collections.indexOfSubList(list,li); <br /> System.out.println(“===”+ locations); <br /> //l果 1 <br /> <br /> 10) Rotate <br /> Ҏ指定的距d@环移动指定列表中的元?<br /> Collections.rotate(list,-1); <br /> 如果是负敎ͼ则正向移动,正数则方向移?<br /> double array[] = {112, 111, 23, 456, 231 }; <br /> List list = new ArrayList(); <br /> for (int i = 0; i < array.length; i++) { <br /> list.add(new Double(array[i])); <br /> } <br /> Collections.rotate(list,-1); <br /> for (int i = 0; i <list.size(); i++) { <br /> System.out.println("list[" + i + "]=" + list.get(i)); <br /> } <br /> //l果Q?11,23,456,231,112 <img src ="//www.355548.live/algz/aggbug/321301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2010-05-18 17:45 <a href="//www.355548.live/algz/articles/321301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>启动tomcat服务时出现错误Failed creating java D:\jre6\bin\client\jvm.dll的解军_? - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/292629.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 26 Aug 2009 04:12:00 GMT//www.355548.live/algz/articles/292629.html//www.355548.live/algz/comments/292629.html//www.355548.live/algz/articles/292629.html#Feedback0//www.355548.live/algz/comments/commentRss/292629.html//www.355548.live/algz/services/trackbacks/292629.html

紫蝶∏飛揚↗ 2009-08-26 12:12 发表评论
]]>
JAVA字符串处理函数列?/title><link>//www.355548.live/algz/articles/292513.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 25 Aug 2009 05:34:00 GMT</pubDate><guid>//www.355548.live/algz/articles/292513.html</guid><wfw:comment>//www.355548.live/algz/comments/292513.html</wfw:comment><comments>//www.355548.live/algz/articles/292513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/292513.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/292513.html</trackback:ping><description><![CDATA[<p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">substring</span>()<br /> 它有两种形式Q第一U是QString substring(int startIndex)<br /> W二U是QString substring(int startIndex,int endIndex)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">concat</span>() q接两个字符?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">replace</span>() 替换<br /> 它有两种形式Q第一UŞ式用一个字W在调用字符串中所有出现某个字W的地方q行替换QŞ式如下:<br /> String replace(char original,char replacement)<br /> 例如QString s=”Hello”.replace(’l',’w');<br /> W二UŞ式是用一个字W序列替换另一个字W序列,形式如下Q?br /> String replace(CharSequence original,CharSequence replacement)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">trim</span>() L起始和结I格</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">valueOf</span>() 转换为字W串</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">toLowerCase</span>() 转换为小?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">toUpperCase</span>() 转换为大?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">length</span>() 取得字符串的长度<br /> 例:<br /> char chars[]={’a',’b’.’c'};<br /> String s=new String(chars);<br /> int len=s.length();</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">charAt</span>() 截取一个字W?br /> 例:<br /> char ch;<br /> ch=”abc”.charAt(1); <br /> q回gؓ’b’</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">getChars</span>() 截取多个字符<br /> void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)<br /> sourceStart 指定了子串开始字W的下标<br /> sourceEnd 指定了子串结束后的下一个字W的下标。因此,子串包含从sourceStart到sourceEnd-1的字W?br /> target 指定接收字符的数l?br /> targetStart target中开始复制子串的下标?br /> 例:<br /> String s=”this is a demo of the getChars method.”;<br /> char buf[]=new char[20];<br /> s.getChars(10,14,buf,0);</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">getBytes</span>()<br /> 替代getChars()的一U方法是字W存储在字节数组中,该方法即getBytes()<br /> 例:<br /> String s = “Hello!你好Q?#8221;; <br /> byte[] bytes = s.getBytes(); </p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">toCharArray</span>()<br /> 例:<br /> String s = “Hello!你好Q?#8221;; <br /> char[] ss = s.toCharArray();</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">equals</span>()?span style="color: #3366ff">equalsIgnoreCase</span>() 比较两个字符?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">regionMatches</span>() 用于比较一个字W串中特定区域与另一特定区域Q它有一个重载的形式允许在比较中忽略大小写?br /> boolean regionMatches(int startIndex,String str2,int<br /> str2StartIndex,int numChars)<br /> boolean regionMatches(boolean ignoreCase,int startIndex,String<br /> str2,int str2StartIndex,int numChars)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">startsWith</span>()?span style="color: #3366ff">endsWith</span>()<br /> startsWith()Ҏ军_是否以特定字W串开始,endWith()Ҏ军_是否以特定字W串l束</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">equals</span>()?=<br /> equals()Ҏ比较字符串对象中的字W,==q算W比较两个对象是否引用同一实例?br /> 例:String s1=”Hello”;<br /> String s2=new String(s1);<br /> s1.eauals(s2); //true<br /> s1==s2;//false</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">compareTo</span>()和compareToIgnoreCase() 比较字符?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #3366ff">indexOf</span>()?span style="color: #3366ff">lastIndexOf</span>()<br /> indexOf() 查找字符或者子串第一ơ出现的地方?br /> lastIndexOf() 查找字符或者子串是后一ơ出现的地方?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">StringBuffer</span>构造函?br /> StringBuffer定义了三个构造函敎ͼ<br /> StringBuffer()<br /> StringBuffer(int size)<br /> StringBuffer(String str)<br /> StringBuffer(CharSequence chars)</p> <p>下面?span style="color: #33cccc">StringBuffer</span>相关的函敎ͼ<br /> <img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">length</span>()和capacity()<br /> 一个StringBuffer当前长度可通过length()Ҏ得到,而整个可分配I间通过capacity()Ҏ得到?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">ensureCapacity</span>() 讄~冲区的大小<br /> void ensureCapacity(int capacity)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">setLength</span>() 讄~冲区的长度<br /> void setLength(int len)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">charAt</span>()?span style="color: #33cccc">setCharAt</span>()<br /> char charAt(int where)<br /> void setCharAt(int where,char ch)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">getChars</span>()<br /> void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">append</span>() 可把Mcd数据的字W串表示q接到调用的StringBuffer对象的末?br /> 例:int a=42;<br /> StringBuffer sb=new StringBuffer(40);<br /> String s=sb.append(”a=”).append(a).append(”!”).toString();</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">insert</span>() 插入字符?br /> StringBuffer insert(int index,String str)<br /> StringBuffer insert(int index,char ch)<br /> StringBuffer insert(int index,Object obj)<br /> index指定字W串插入到StringBuffer对象中的位置的下标?/p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">reverse</span>() 颠倒StringBuffer对象中的字符<br /> StringBuffer reverse()</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">delete</span>()?span style="color: #33cccc">deleteCharAt</span>() 删除字符<br /> StringBuffer delete(int startIndex,int endIndex)<br /> StringBuffer deleteCharAt(int loc)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">replace</span>() 替换<br /> StringBuffer replace(int startIndex,int endIndex,String str)</p> <p><img alt="" src="//ntt.cc/wp-content/themes/i3theme-1-5-right/images/bullet-grey.gif" /><span style="color: #33cccc">substring</span>() 截取子串<br /> String substring(int startIndex)<br /> String substring(int startIndex,int endIndex)</p> <img src ="//www.355548.live/algz/aggbug/292513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2009-08-25 13:34 <a href="//www.355548.live/algz/articles/292513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mcd的数l初始化Ҏ - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/292507.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 25 Aug 2009 05:28:00 GMT//www.355548.live/algz/articles/292507.html//www.355548.live/algz/comments/292507.html//www.355548.live/algz/articles/292507.html#Feedback0//www.355548.live/algz/comments/commentRss/292507.html//www.355548.live/algz/services/trackbacks/292507.html String[] s=new String[3];                //推荐.
String[] s=new String[]{"","",""};



紫蝶∏飛揚↗ 2009-08-25 13:28 发表评论
]]>
[转]常用正则表达式收?/title><link>//www.355548.live/algz/articles/263359.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 01 Apr 2009 06:47:00 GMT</pubDate><guid>//www.355548.live/algz/articles/263359.html</guid><wfw:comment>//www.355548.live/algz/comments/263359.html</wfw:comment><comments>//www.355548.live/algz/articles/263359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.355548.live/algz/comments/commentRss/263359.html</wfw:commentRss><trackback:ping>//www.355548.live/algz/services/trackbacks/263359.html</trackback:ping><description><![CDATA[<p>正则表达式用于字W串处理、表单验证等场合Q实用高效。现一些常用的表达式收集于此,以备不时之需?br /> </p> <p>匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]<br /> 评注Q匹配中文还真是个头疼的事,有了q个表达式就好办?/p> <p>匚w双字节字W?包括汉字在内)Q[^\x00-\xff]<br /> 评注Q可以用来计字W串的长度(一个双字节字符长度?QASCII字符?Q?/p> <p>匚wI白行的正则表达式:\n\s*\r<br /> 评注Q可以用来删除空白行</p> <p>匚wHTML标记的正则表辑ּQ?lt;(\S*?)[^>]*>.*?</\1>|<.*? /><br /> 评注Q网上流传的版本太糟p,上面q个也仅仅能匚w部分Q对于复杂的嵌套标记依旧无能为力</p> <p>匚w首尾I白字符的正则表辑ּQ^\s*|\s*$<br /> 评注Q可以用来删除行首行I白字符(包括I格、制表符、换늬{等)Q非常有用的表达?/p> <p>匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br /> 评注Q表单验证时很实?/p> <p>匚w|址URL的正则表辑ּQ[a-zA-z]+://[^\s]*<br /> 评注Q网上流传的版本功能很有限,上面q个基本可以满需?/p> <p>匚w帐号是否合法(字母开_允许5-16字节Q允许字母数字下划线)Q^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br /> 评注Q表单验证时很实?/p> <p>匚w国内电话LQ\d{3}-\d{8}|\d{4}-\d{7}<br /> 评注Q匹配Ş式如 0511-4405222 ?021-87888822</p> <p>匚w腾讯QQP[1-9][0-9]{4,}<br /> 评注Q腾讯QQ号从10000开?/p> <p>匚w中国邮政~码Q[1-9]\d{5}(?!\d)<br /> 评注Q中国邮政编码ؓ6位数?/p> <p>匚ww䆾证:\d{15}|\d{18}<br /> 评注Q中国的w䆾证ؓ15位或18?/p> <p>匚wip地址Q\d+\.\d+\.\d+\.\d+<br /> 评注Q提取ip地址时有?/p> <p>匚w特定数字Q?br /> ^[1-9]\d*$    //匚w正整?br /> ^-[1-9]\d*$   //匚w负整?br /> ^-?[1-9]\d*$   //匚w整数<br /> ^[1-9]\d*|0$  //匚w非负整数Q正整数 + 0Q?br /> ^-[1-9]\d*|0$   //匚w非正整数Q负整数 + 0Q?br /> ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匚w正QҎ<br /> ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匚w负QҎ<br /> ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匚w点?br /> ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匚w非负点敎ͼ正QҎ + 0Q?br /> ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匚w非正点敎ͼ负QҎ + 0Q?br /> 评注Q处理大量数据时有用Q具体应用时注意修正</p> <p>匚w特定字符Ԍ<br /> ^[A-Za-z]+$  //匚w?6个英文字母组成的字符?br /> ^[A-Z]+$  //匚w?6个英文字母的大写l成的字W串<br /> ^[a-z]+$  //匚w?6个英文字母的写l成的字W串<br /> ^[A-Za-z0-9]+$  //匚w由数字和26个英文字母组成的字符?br /> ^\w+$  //匚w由数字?6个英文字母或者下划线l成的字W串<br /> 评注Q最基本也是最常用的一些表辑ּ</p> 转自://lifesinger.3322.org/myblog/?p=185<img src ="//www.355548.live/algz/aggbug/263359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.355548.live/algz/" target="_blank">紫蝶∏飛揚↗</a> 2009-04-01 14:47 <a href="//www.355548.live/algz/articles/263359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]正则表达?0分钟入门教程 - 棒球比分大小怎么算|վ//www.355548.live/algz/articles/229762.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 18 Sep 2008 09:48:00 GMT//www.355548.live/algz/articles/229762.html//www.355548.live/algz/comments/229762.html//www.355548.live/algz/articles/229762.html#Feedback0//www.355548.live/algz/comments/commentRss/229762.html//www.355548.live/algz/services/trackbacks/229762.html美国职业棒球比分数据:正则表达?0分钟入门教程

版本Qv2.3 (2008-4-13) 作者:deerchao 转蝲h?a >来源

目录

跌目录

  1. 本文目标
  2. 如何使用本教E?/a>
  3. 正则表达式到底是什么东西?
  4. 入门
  5. 试正则表达?/a>
  6. 元字W?/a>
  7. 字符转义
  8. 重复
  9. 字符c?/a>
  10. 分枝条g
  11. 反义
  12. 分组
  13. 后向引用
  14. 零宽断言
  15. 负向零宽断言
  16. 注释
  17. 贪婪与懒?/a>
  18. 处理选项
  19. ql?递归匚w
  20. q有些什么东西没提到
  21. 联系作?/a>
  22. 最?来点q告...
  23. |上的资源及本文参考文?/a>
  24. 更新说明

本文目标

30分钟内让你明白正则表辑ּ是什么,q对它有一些基本的了解Q让你可以在自己的程序或|页里用它?/p>

如何使用本教E?/h2>

最重要的是——L?em>30分钟Q如果你没有使用正则表达式的l验Q请不要试图?0U?/em>内入?#8212;—除非你是h :)

别被下面那些复杂的表辑ּ吓倒,只要跟着我一步一步来Q你会发现正则表辑ּ其实q?span lang="zh-cn">没有你想像中的那么困难。当Ӟ如果你看完了q篇教程之后Q发现自己明白了很多Q却又几乎什么都C得,那也是很正常?#8212;—我认为,没接触过正则表达式的人在看完q篇教程后,能把提到q的语法C80%以上的可能性ؓ零。这里只是让你明白基本的原理Q以后你q需要多l习Q多使用Q才能熟l掌握正则表辑ּ?/p>

除了作ؓ入门教程之外Q本文还试图成ؓ可以在日常工作中使用的正则表辑ּ语法参考手册。就作者本人的l历来说Q这个目标还是完成得不错?#8212;—你看Q我自己也没能把所有的东西C来,不是吗?

清除格式 文本格式U定Q?span class="name">专业术语 元字W?语法格式 正则表达?/span> 正则表达式中的一部分(用于分析) 对其q行匚w的源字符?/span> Ҏ则表辑ּ或其中一部分的说?/span>

隐藏Ҏ 本文双有一些注释,主要是用来提供一些相关信息,或者给没有E序员背景的读者解释一些基本概念,通常可以忽略?/p>

正则表达式到底是什么东西?

字符是计机软g处理文字时最基本的单位,可能是字母,数字Q标点符PI格Q换行符Q汉字等{?span class="name">字符?/span>?个或更多个字W的序列?span class="name">文本也就是文字,字符丌Ӏ说某个字符?span class="name">匚w某个正则表达式,通常是指q个字符串里有一部分Q或几部分分别)能满辑ּl出的条件?/p>

在编写处理字W串的程序或|页Ӟl常会有查找W合某些复杂规则的字W串的需要?span class="name">正则表达?/span>是用于描述q些规则的工兗换句话_正则表达式就是记录文本规则的代码?/p>

很可能你使用qWindows/Dos下用于文件查扄通配W?wildcard)Q也是*?span class="code">?。如果你x找某个目录下的所有的Word文的话Q你会搜?span style="color: red;">*.doc。在q里Q?span class="code">*会被解释成Q意的字符丌Ӏ和通配W类|正则表达式也是用来进行文本匹配的工具Q只不过比v通配W,它能更精地描述你的需?#8212;—当然Q代价就是更复杂——比如你可以编写一个正则表辑ּQ用来查?span class="desc">所有以0开_后面跟着2-3个数字,然后是一个连字号“-”Q最后是7?位数字的字符?/span>(?span class="string">010-12345678?span class="string">0376-7654321)?/p>

入门

学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子q行修改Q实验。下面给Z不少单的例子Qƈ对它们作了详l的说明?/p>

假设你在一英文小说里查找hiQ你可以使用正则表达?span class="regex">hi?/p>

q几乎是最单的正则表达式了Q它可以_匚wq样的字W串Q?span class="desc">׃个字W组成,前一个字W是h,后一个是i。通常Q处理正则表辑ּ的工具会提供一个忽略大写的选项Q如果选中了这个选项Q它可以匚whi,HI,Hi,hIq四U情况中的Q意一U?/p>

不幸的是Q很多单词里包含hiq两个连l的字符Q比?span class="string">him,history,high{等。用hi来查扄话,q里边的hi也会被找出来。如果要_地查找hiq个单词的话Q我们应该?span class="regex">\bhi\b?/p>

\b是正则表辑ּ规定的一个特D代码(好吧Q某些h叫它元字W,metacharacterQ,代表着单词的开头或l尾Q也是单词的分界处。虽焉常英文的单词是q|标点W号或者换行来分隔的,但是\bq不匚wq些单词分隔字符中的M一个,?strong>只匹配一个位|?/strong>?/p>

如果需要更_的说法,\b匚wq样的位|:它的前一个字W和后一个字W不全是(一个是,一个不是或不存?\w?/p>

假如你要扄?span class="desc">hi后面不远处跟着一个LucyQ你应该?span class="regex">\bhi\b.*\bLucy\b?/p>

q里Q?span class="part">.是另一个元字符Q匹?span class="desc">除了换行W以外的L字符?span class="part">*同样是元字符Q不q它代表的不是字W,也不是位|,而是数量——它指?前边的内容可以连l重复出CQ意次以整个表达式得到匹?/span>。因此,.*q在一起就意味着L数量的不包含换行的字W?/span>。现?span class="regex">\bhi\b.*\bLucy\b的意思就很明显了Q?span class="desc">先是一个单词hi,然后是Q意个L字符(但不能是换行)Q最后是Lucyq个单词?/p>

换行W就?\n',ASCII~码?0(十六q制0x0A)的字W?/p>

如果同时使用其它元字W,我们p构造出功能更强大的正则表达式。比如下面这个例子:

0\d\d-\d\d\d\d\d\d\d\d匚wq样的字W串Q?span class="desc">?开_然后是两个数字,然后是一个连字号“-”Q最后是8个数?/span>(也就是中国的电话L。当Ӟq个例子只能匚w区号?位的情Ş)?/p>

q里?span class="part">\d是个新的元字W,匚w一位数?0Q或1Q或2Q或……)?span class="part">-不是元字W,只匹配它本n——q字W或者减受?/p>

Z避免那么多烦人的重复Q我们也可以q样写这个表辑ּQ?span class="regex">0\d{2}-\d{8}?q里\d后面?span class="part">{2}({8})的意思是前面\d必须q箋重复匚w2?8??/p>

试正则表达?/h2>

如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么Q你不是地球人。正则表辑ּ的语法很令h头疼Q即使对l常使用它的人来说也是如此。由于难于读写,Ҏ出错Q所以找一U工具对正则表达式进行测试是很有必要的?/p>

׃在不同的环境下正则表辑ּ的一些细节是不相同的Q本教程介绍的是微Y .Net Framework 2.0下正则表辑ּ的行为,所以,我向你介l一?Net下的工具.Net Framework 2.0Q然?a title="从www.unibetter.com下蝲Regex Tester, 75KB" >下蝲Regex Tester。这是个l色软gQ下载完后打开压羃?直接q行RegexTester.exe可以了?/p>

下面是Regex Testerq行时的截图Q?/p>

Regex Testerq行时的截图

元字W?/h2>

现在你已l知道几个很有用的元字符了,?span class="code">\b,.,*Q还?span class="code">\d.正则表达式里q有更多的元字符Q比?span class="code">\s匚wL的空白符Q包括空|制表W?Tab)Q换行符Q中文全角空格等?span class="code">\w匚w字母或数字或下划U或汉字{?/span>?/p>

对中?汉字的特D处理是?Net提供的正则表辑ּ引擎支持的,其它环境下的具体情况h看相x??/p>

下面来看看更多的例子Q?/p>

\ba\w*\b匚w以字?span class="part">a开头的单词——先是某个单词开始处(\b)Q然后是字母a,然后是Q意数量的字母或数?\w*)Q最后是单词l束?\b)?/p>

好吧Q现在我们说说正则表辑ּ里的单词是什么意思吧Q就是多于一个的q箋?span class="code">\w。不错,q与学习英文时要背的成千上万个同名的东西的确关系不大 :)

\d+匚w1个或更多q箋的数?/span>。这里的+是和*cM的元字符Q不同的?span class="code">*匚w重复L?可能??Q?span class="code">+则匹?span class="desc">重复1ơ或更多?/span>?/p>

\b\w{6}\b 匚w刚好6个字?数字的单?/span>?/p>
?.常用的元字符
代码 说明
. 匚w除换行符以外的Q意字W?/span>
\w 匚w字母或数字或下划U或汉字
\s 匚wL的空白符
\d 匚w数字
\b 匚w单词的开始或l束
^ 匚w字符串的开?/span>
$ 匚w字符串的l束

元字W?span class="code">^Q和数字6在同一个键位上的符P?span class="code">$都匹配一个位|,q和\b有点cM?span class="code">^匚w你要用来查找的字W串的开_$匚wl尾。这两个代码在验证输入的内容旉常有用,比如一个网站如果要求你填写的QQ号必Mؓ5位到12位数字时Q可以用:^\d{5,12}$?/p>

q里?span class="part">{5,12}和前面介l过?span class="part">{2}是类似的Q只不过{2}匚w只能不多不少重复2?/span>Q?span class="part">{5,12}则是重复的次C能少?ơ,不能多于12?/span>Q否则都不匹配?/p>

因ؓ使用?span class="part">^?span class="part">$Q所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须??2个数?/span>Q因此如果输入的QQ可匚wq个正则表达式的话,那就W合要求了?/p>

和忽略大写的选项cMQ有些正则表辑ּ处理工具q有一个处理多行的选项。如果选中了这个选项Q?span class="code">^?span class="code">$的意义就变成?span class="desc">匚w行的开始处和结束处?/p>

字符转义

如果你想查找元字W本w的话,比如你查?span class="desc">.,或?span class="desc">*,出C问题Q你没办法指定它们,因ؓ它们会被解释成别的意思。这时你得使用\来取消这些字W的Ҏ意义。因此,你应该?span class="regex">\.?span class="regex">\*。当Ӟ要查?span class="desc">\本nQ你也得?span class="regex">\\.

例如Q?span class="regex">unibetter\.com匚wunibetter.comQ?span class="regex">C:\\Windows匚wC:\Windows?/p>

重复

你已l看q了前面?span class="code">*,+,{2},{5,12}q几个匹配重复的方式了。下面是正则表达式中所有的限定W?指定数量的代码,例如*,{5,12}{?Q?/p>
?.常用的限定符
代码/语法 说明
* 重复零次或更多次
+ 重复一ơ或更多?/span>
? 重复零次或一?/span>
{n} 重复n?/span>
{n,} 重复nơ或更多?/span>
{n,m} 重复n到m?/span>

下面是一些用重复的例子Q?/p>

Windows\d+匚wWindows后面?个或更多数字

^\w+匚w一行的W一个单?或整个字W串的第一个单词,具体匚w哪个意思得看选项讄)

字符c?/h2>

要想查找数字Q字母或数字Q空白是很简单的Q因为已l有了对应这些字W集合的元字W,但是如果你想匚w没有预定义元字符的字W集?比如元音字母a,e,i,o,u),应该怎么办?

很简单,你只需要在Ҏ号里列出它们p了,?span class="regex">[aeiou]匹?span class="desc">M一个英文元韛_?/span>Q?span class="regex">[.?!]匚w标点W号(.??)?/p>

我们也可以轻村֜指定一个字W?span class="name">范围Q像[0-9]代表的含意与\d是完全一致的Q?span class="desc">一位数?/span>Q同?span class="regex">[a-z0-9A-Z_]也完全等同于\wQ如果只考虑英文的话Q?/p>

下面是一个更复杂的表辑ּQ?span class="regex">\(?0\d{2}[) -]?\d{8}?/p>

“(”?#8220;)”也是元字W,后面?a >分组?/a>里会提到Q所以在q里需要?a >转义?/p>

q个表达式可以匹?span class="desc">几种格式的电话号?/span>Q像(010)88886666Q或022-22334455Q或02912345678{。我们对它进行一些分析吧Q首先是一个{义字W?span class="part">\(,它能出现0ơ或1??),然后是一?span class="part">0Q后面跟着2个数?\d{2})Q然后是)?span class="part">-?span class="part">I格中的一个,它出?ơ或不出??)Q最后是8个数?\d{8})?/p>

分枝条g

不幸的是Q刚才那个表辑ּ也能匚w010)12345678?span class="string">(022-87654321q样?#8220;不正?#8221;的格式。要解决q个问题Q我们需要用?span class="name">分枝条g。正则表辑ּ里的分枝条g指的是有几种规则Q如果满_中Q意一U规则都应该当成匚wQ具体方法是?span class="code">|把不同的规则分隔开。听不明白?没关p,看例子:

0\d{2}-\d{8}|0\d{3}-\d{7}q个表达式能匚w两种以连字号分隔的电话号码:一U是三位区号Q?位本地号(?10-12345678)Q一U是4位区P7位本地号(0376-2233445)?/p>

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}q个表达?span class="desc">匚w3位区L电话LQ其中区号可以用括hhQ也可以不用Q区号与本地号间可以用连字号或空格间隔,也可以没有间?/span>。你可以试试用分枝条件把q个表达式扩展成也支?位区L?/p>

\d{5}-\d{4}|\d{5}q个表达式用于匹配美国的邮政~码。美国邮~的规则?位数字,或者用q字号间隔的9位数字。之所以要l出q个例子是因为它能说明一个问题:使用分枝条gӞ要注意各个条件的序。如果你把它Ҏ\d{5}|\d{5}-\d{4}的话Q那么就只会匚w5位的邮编(以及9位邮~的??。原因是匚w分枝条gӞ会从左到右地测试每个条Ӟ如果满了某个分枝的话,׃会去再管其它的条件了?/p>

分组

我们已经提到了怎么重复单个字符Q直接在字符后面加上限定W就行了Q;但如果想要重复多个字W又该怎么办?你可以用括h指定子表辑ּ(也叫?span class="name">分组)Q然后你可以指定这个子表达式的重复ơ数了,你也可以对子表达式进行其它一些操?后面会有介绍)?/p>

(\d{1,3}\.){3}\d{1,3}是一?span class="desc">单的IP地址匚w表达式。要理解q个表达式,h下列序分析它:\d{1,3}匚w1?位的数字Q?span class="part">(\d{1,3}\.){3}匚w三位数字加上一个英文句?q个整体也就是这?span class="name">分组)重复3?/span>Q最后再加上一个一C位的数字(\d{1,3})?/p>

IP地址中每个数字都不能大于255Q大家千万不要被?4》第三季的编剧给忽悠?..

不幸的是Q它也将匚w256.300.888.999q种不可能存在的IP地址。如果能使用术比较的话Q或许能单地解决q个问题Q但是正则表辑ּ中ƈ不提供关于数学的M功能Q所以只能用冗长的分组Q选择Q字W类来描qC个正的IP地址Q?span class="regex">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)?/p>

理解q个表达式的关键是理?span class="part">2[0-4]\d|25[0-5]|[01]?\d\d?Q这里我׃l说了,你自己应该能分析得出来它的意义?/p>

反义

有时需要查找不属于某个能简单定义的字符cȝ字符。比如想查找除了数字以外Q其它Q意字W都行的情况Q这旉要用?span class="name">反义Q?/p>
?.常用的反义代?/caption>
代码/语法 说明
\W 匚wL不是字母Q数字,下划U,汉字的字W?/span>
\S 匚wL不是I白W的字符
\D 匚wL非数字的字符
\B 匚w不是单词开头或l束的位|?/span>
[^x] 匚w除了x以外的Q意字W?/span>
[^aeiou] 匚w除了aeiouq几个字母以外的L字符

例子Q?span class="regex">\S+匚w不包含空白符的字W串?/p>

<a[^>]+>匚w用尖括号括v来的以a开头的字符?/span>?/p>

后向引用

使用括h定一个子表达式后Q?strong>匚wq个子表辑ּ的文?/strong>(也就是此分组捕获的内?可以在表辑ּ或其它程序中作进一步的处理。默认情况下Q每个分l会自动拥有一?span class="name">l号Q规则是Q从左向叻I以分l的左括号ؓ标志Q第一个出现的分组的组号ؓ1Q第二个?Q以此类推?/p>

后向引用用于重复搜烦前面某个分组匚w的文本。例如,\1代表分组1匚w的文?/span>。难以理解?LCZQ?/p>

\b(\w+)\b\s+\1\b可以用来匚w重复的单?/span>Q像go go, 或?span class="string">kitty kitty。这个表辑ּ首先?span class="desc">一个单?/span>Q也是单词开始处和结束处之间的多于一个的字母或数?/span>(\b(\w+)\b)Q这个单词会被捕获到~号?的分l中Q然后是1个或几个I白W?/span>(\s+)Q最后是分组1中捕L内容Q也是前面匚w的那个单词)(\1)?/p>

你也可以自己指定子表辑ּ?span class="name">l名。要指定一个子表达式的l名Q请使用q样的语法:(?<Word>\w+)(或者把括h?span class="code">'也行Q?span class="code">(?'Word'\w+)),q样把\w+的组名指定ؓWord了。要反向引用q个分组捕获的内容,你可以?span class="code">\k<Word>,所以上一个例子也可以写成q样Q?span class="regex">\b(?<Word>\w+)\b\s+\k<Word>\b?/p>

使用括L时候,q有很多特定用途的语法。下面列Z最常用的一些:

?.常用分组语法
分类 代码/语法 说明
捕获 (exp) 匚wexp,q捕h本到自动命名的组?/span>
(?<name>exp) 匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp)
(?:exp) 匚wexp,不捕获匹配的文本Q也不给此分l分配组?/span>
零宽断言 (?=exp) 匚wexp前面的位|?/span>
(?<=exp) 匚wexp后面的位|?/span>
(?!exp) 匚w后面跟的不是exp的位|?/span>
(?<!exp) 匚w前面不是exp的位|?/span>
注释 (?#comment) q种cd的分l不Ҏ则表辑ּ的处理生Q何媄响,用于提供注释让h阅读

我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式Q只是这Ll匹配的内容不会像前两种那样被捕获到某个l里面,也不会拥有组?/span>?/p>

零宽断言

地球人,是不是觉得这些术语名U太复杂Q太难记了?我也和你一栗知道有q么一U东西就行了Q它叫什么,随它dQ?#8220;无名Q万物之?..”

接下来的四个用于查找在某些内?但ƈ不包括这些内?之前或之后的东西Q也是说它们像\b,^,$那样用于指定一个位|,q个位置应该满一定的条g(xa)Q因此它们也被称?span class="name">零宽断言。最好还是拿例子来说明吧Q?/p>

断言用来声明一个应该ؓ真的事实。正则表辑ּ中只有当断言为真时才会l进行匹配?/p>

(?=exp)也叫零宽度正预测先行断言Q它断言自n出现的位|的后面能匹配表辑ּexp。比?span class="regex">\b\w+(?=ing\b)Q匹?span class="desc">以ingl尾的单词的前面部分(除了ing以外的部?Q如查找I'm singing while you're dancing.Ӟ它会匚wsing?span class="desc">danc?/p>

(?<=exp)也叫零宽度正回顾后发断言Q它断言自n出现的位|的前面能匹配表辑ּexp。比?span class="regex">(?<=\bre)\w+\b会匹?span class="desc">以re开头的单词的后半部?除了re以外的部?Q例如在查找reading a bookӞ它匹?span class="desc">ading?/p>

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从双加v?Q你可以q样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\bQ用它对1234567890q行查找时结果是234567890?/p>

下面q个例子同时使用了这两种断言Q?span class="regex">(?<=\s)\d+(?=\s)匚w以空白符间隔的数?再次Q不包括q些I白W??/p>

负向零宽断言

前面我们提到q怎么查找不是某个字符或不在某个字W类?/strong>的字W的Ҏ(反义)。但是如果我们只是想?strong>保某个字符没有出现Q但q不惛_匚w?/strong>时怎么办?例如Q如果我们想查找q样的单?-它里面出C字母q,但是q后面跟的不是字母u,我们可以试q样Q?/p>

\b\w*q[^u]\w*\b匚w包含后面不是字母u的字母q的单?/span>。但是如果多做测?或者你思维_敏锐Q直接就观察出来?Q你会发玎ͼ如果q出现在单词的l尾的话Q像Iraq,BenqQ这个表辑ּ׃出错。这是因?span class="part">[^u]总要匚w一个字W,所以如果q是单词的最后一个字W的话,后面?span class="part">[^u]会匚wq后面的单词分隔符(可能是空|或者是句号或其它的什?Q后面的\w*\b会匚w下一个单词,于是\b\w*q[^u]\w*\bp匚w整个Iraq fighting?span class="name">负向零宽断言能解册L问题Q因为它只匹配一个位|,q不消费M字符。现在,我们可以q样来解册个问题:\b\w*q(?!u)\w*\b?/p>

零宽度负预测先行断言(?!exp)Q?span class="desc">断言此位|的后面不能匚w表达式exp。例如:\d{3}(?!\d)匚w三位数字Q而且q三位数字的后面不能是数?/span>Q?span class="regex">\b((?!abc)\w)+\b匚w不包含连l字W串abc的单?/span>?/p>

同理Q我们可以用(?<!exp),零宽度正回顾后发断言?span class="desc">断言此位|的前面不能匚w表达式expQ?span class="regex">(?<![a-z])\d{7}匚w前面不是写字母的七位数?/span>?/p>

误l分析表辑ּ(?<=<(\w+)>).*(?=<\/\1>)Q这个表辑ּ最能表现零宽断a的真正用途?/p>

一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匚w不包含属性的单HTML标签内里的内?/span>?span class="code">(<?(\w+)>)指定了这L前缀Q?span class="desc">被尖括号括v来的单词(比如可能?lt;b>)Q然后是.*(L的字W串),最后是一?span class="name">后缀(?=<\/\1>)。注意后~里的\/Q它用到了前面提q的字符转义Q?span class="part">\1则是一个反向引用,引用的正?span class="desc">捕获的第一l?/span>Q前面的(\w+)匚w的内容,q样如果前缀实际上是<b>的话Q后~是</b>了。整个表辑ּ匚w的是<b>?lt;/b>之间的内?再次提醒Q不包括前缀和后~本n)?/p>

注释

括L另一U用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)?/p>

要包含注释的话,最好是启用“忽略模式里的I白W?#8221;选项Q这样在~写表达式时能Q意的dI格QTabQ换行,而实际用时q些都将被忽略。启用这个选项后,?后面到这一行结束的所有文本都被当成注释忽略掉。例如,我们可以前面的一个表辑ּ写成q样Q?/p>

      (?<=    # 断言要匹配的文本的前~
<(\w+)> # 查找括hh的字母或数字(即HTML/XML标签)
) # 前缀l束
.* # 匚wL文本
(?= # 断言要匹配的文本的后~
<\/\1> # 查找括hh的内容:前面是一?/"Q后面是先前捕获的标{?br /> ) # 后缀l束

贪婪与懒?/h2>

当正则表辑ּ中包含能接受重复的限定符Ӟ通常的行为是Q在使整个表辑ּ能得到匹配的前提下)匚w可能多的字W。考虑q个表达式:a.*bQ它会匚w最长的以a开始,以bl束的字W串。如果用它来搜烦aabab的话Q它会匹配整个字W串aabab。这被称?span class="name">贪婪匚w?/p>

有时Q我们更需?span class="name">懒惰匚wQ也是匚w可能少的字W。前面给出的限定W都可以被{化ؓ懒惰匚w模式Q只要在它后面加上一个问?span class="code">?。这?span class="regex">.*?意味着匚wL数量的重复,但是在能使整个匹配成功的前提下用最的重复。现在看看懒惰版的例子吧Q?/p>

a.*?b匚w最短的Q以a开始,以bl束的字W串。如果把它应用于aabab的话Q它会匹?span class="desc">aabQ第一到第三个字符Q?/span>?span class="desc">abQ第四到W五个字W)?/p>

Z么第一个匹配是aabQ第一到第三个字符Q而不是abQ第二到W三个字W)Q简单地_因ؓ正则表达式有另一条规则,比懒惎ͼ贪婪规则的优先更高Q最先开始的匚w拥有最高的优先?#8212;—The match that begins earliest wins?/p>
?.懒惰限定W?/caption>
代码/语法 说明
*? 重复Lơ,但尽可能重?/span>
+? 重复1ơ或更多ơ,但尽可能重?/span>
?? 重复0ơ或1ơ,但尽可能重?/span>
{n,m}? 重复n到mơ,但尽可能重?/span>
{n,}? 重复nơ以上,但尽可能重?/span>

处理选项

在C#中,你可以?a title="MSDN 相关文" >Regex(String, RegexOptions)构造函?/a>来设|正则表辑ּ的处理选项。如QRegex regex = new Regex("\ba\w{6}\b", RegexOptions.IgnoreCase);

上面介绍了几个选项如忽略大写Q处理多行等Q这些选项能用来改变处理正则表辑ּ的方式。下面是.Net中常用的正则表达式选项Q?/p>
?.常用的处理选项
名称 说明
IgnoreCase(忽略大小? 匚w时不区分大小写?/td>
Multiline(多行模式) 更改^?span class="code">$的含义,使它们分别在L一行的行首和行֌配,而不仅仅在整个字W串的开头和l尾匚w?在此模式?$的精含意是:匚w\n之前的位|以及字W串l束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字W匹配(包括换行W\nQ?
IgnorePatternWhitespace(忽略I白) 忽略表达式中的非转义I白q启用由#标记的注释?/td>
RightToLeft(从右向左查找) 匚w从右向左而不是从左向双行?/td>
ExplicitCapture(昑ּ捕获) 仅捕获已被显式命名的l?/td>
ECMAScript(JavaScript兼容模式) 使表辑ּ的行Z它在JavaScript里的行ؓ一致?/td>

一个经常被问到的问题是Q是不是只能同时使用多行模式和单行模式中的一U?{案是:不是。这两个选项之间没有M关系Q除了它们的名字比较怼Q以至于让h感到疑惑Q以外?/p>

ql?递归匚w

q里介绍的^衡组语法是由.Net Framework支持的;其它语言Q库不一定支持这U功能,或者支持此功能但需要用不同的语法?/p>

有时我们需要匹配像( 100 * ( 50 + 15 ) )q样的可嵌套的层ơ性结?/span>Q这时简单地使用\(.+\)则只会匹配到最左边的左括号和最双的右括号之间的内?q里我们讨论的是贪婪模式Q懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次C相等Q比?span class="string">( 5 / ( 3 + 2 ) ) )Q那我们的匹配结果里两者的个数也不会相{。有没有办法在这L字符串里匚w到最长的Q配对的括号之间的内容呢Q?/p>

Z避免(?span class="code">\(把你的大脑彻底搞p涂Q我们还是用括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yyq样的字W串里,最长的配对的尖括号内的内容捕获出来Q?/p>

q里需要用C下的语法构造:

  • (?'group') 把捕L内容命名为group,q压?span class="name">堆栈(Stack)
  • (?'-group') 从堆栈上弹出最后压入堆栈的名ؓgroup的捕获内容,如果堆栈本来为空Q则本分l的匚wp|
  • (?(group)yes|no) 如果堆栈上存在以名ؓgroup的捕获内容的话,l箋匚wyes部分的表辑ּQ否则l匹配no部分
  • (?!) 零宽负向先行断言Q由于没有后~表达式,试图匚wLp|

如果你不是一个程序员Q或者你自称E序员但是不知道堆栈是什么东西)Q你pL解上面的三种语法吧:W一个就是在黑板上写一?group"Q第二个是从黑板上擦掉一?group"Q第三个是看黑板上写的q有没有"group"Q如果有ql匹配yes部分Q否则就匚wno部分?/p>

我们需要做的是每碰C左括P在压入一?Open",每碰C个右括号Q就弹出一个,C最后就看看堆栈是否为空Q-如果不ؓI那p明左括号比右括号多,那匹配就应该p|。正则表辑ּ引擎会进行回?攑ּ最前面或最后面的一些字W?Q尽量整个表达式得到匹配?/p>

<                         #最外层的左括号
[^<>]* #最外层的左括号后面的不是括L内容
(
(
(?'Open'<) #到了左括号Q在黑板上写一?Open"
[^<>]* #匚w左括号后面的不是括号的内?br /> )+
(
(?'-Open'>) #到了右括号Q擦掉一?Open"
[^<>]* #匚wx号后面不是括L内容
)+
)*
(?(Open)(?!)) #在遇到最外层的右括号前面Q判断黑板上q有没有没擦掉的"Open"Q如果还有,则匹配失?br /> > #最外层的右括号

ql的一个最常见的应用就是匹配HTML,下面q个例子可以匚w嵌套?lt;div>标签Q?span class="regex"><div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

q有些什么东西没提到

我已l描qC构造正则表辑ּ的大量元素,q有一些我没有提到的东ѝ下面是未提到的元素的列表,包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关?net下正则表辑ּ详细的文??/p>
?.未详细讨论的语?/caption>
代码/语法 说明
\a 报警字符(打印它的效果是电脑嘀一?
\b 通常是单词分界位|,但如果在字符c里使用代表退?/span>
\t 制表W,Tab
\r 回R
\v 竖向制表W?/span>
\f 换页W?/span>
\n 换行W?/span>
\e Escape
\0nn ASCII代码中八q制代码为nn的字W?/span>
\xnn ASCII代码中十六进制代码ؓnn的字W?/span>
\unnnn Unicode代码中十六进制代码ؓnnnn的字W?/span>
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开?cM^Q但不受处理多行选项的媄?
\Z 字符串结或行尾(不受处理多行选项的媄?
\z 字符串结?cM$Q但不受处理多行选项的媄?
\G 当前搜烦的开?/span>
\p{name} Unicode中命名ؓname的字W类Q例如\p{IsGreek}
(?>exp) 贪婪子表辑ּ
(?<x>-<y>exp) ql?/span>
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 辑ּ后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ此组的表辑ּQ否则用no
(?(exp)yes) 同上Q只是用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获C内容Q用yes作ؓ表达式;否则使用no
(?(name)yes) 同上Q只是用空表达式作为no

联系作?/h2>

好吧,我承?我骗了你,dq里你肯定花了不?0分钟.怿?q是我的?而不是因Z太笨.我之所以说"30分钟",是ؓ了让你有信心,有耐心l箋下去.既然你看Cq里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?

要投诉我,或者觉得我其实可以做得更好,或者有M其它问题,Ƣ迎?a >我的博客让我知道.

                                                                      ----------------------//unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm



]]> {ganrao}