split(参数)
说用到正则表达式,想知道到底什么是正则表达式

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【sure2003】截止到2008-07-14 10:33:51的历史汇总数据(不包括此帖):
    发帖的总数量:232                      发帖的总分数:9963                     每贴平均分数:42                       
    回帖的总数量:199                      得分贴总数量:5                        回帖的得分率:2%                       
    结贴的总数量:231                      结贴的总分数:9943                     
    无满意结贴数:2                        无满意结贴分:50                       
    未结的帖子数:1                        未结的总分数:20                       
    结贴的百分比:99.57 %               结分的百分比:99.80 %                  
    无满意结贴率:0.87  %               无满意结分率:0.50  %                  
    值得尊敬
      

  2.   

    一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用——很不幸,这篇文章也不能够改变这一点,不过,经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟(甚至几秒钟)内完成。正则表达式被各种文本编辑软件、类库(例如Rogue Wave的tools.h++)、脚本工具(像awk/grep/sed)广泛的支持,而且像Microsoft的Visual C++这种交互式IDE也开始支持它了。
    去baidu一下吧,比在这问块多了
      

  3.   

    正则表达式主要是用来匹配文本的,给你点参考资料吧
    http://baike.baidu.com/view/94238.htm 
    http://hi.baidu.com/ismayday/blog/item/7f5b86942741d11dd21b708f.html
      

  4.   

    概念不难,可以看看编译原理或者自动机理论,有些理论的指导学起来可能容易些.
    看java文档里对Patter和Matcher两个类的说明,其实内容也不多.
    用多了就好了.
      

  5.   


    import java.util.Arrays;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class RegTest {
    /**
     * JAVA正则表达式常用的方法
     * @param args
     */
    public static void main(String args[]){
    /**
     * 一、查询匹配
     * 
     */
    String str1="abc efg ABC";
    String regEx1="a|f";   //表示a或f
    Pattern p1=Pattern.compile(regEx1);
    Matcher m1=p1.matcher(str1);
    /*
     * 如果str中有regEx,那么rs为true,否则为flase。
     * 如果想在查找时忽略大小写,
     * 则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
     */
    boolean rs1=m1.find();
    System.out.println(rs1);

    //匹配是否有汉字
    String str0="AaBbCc139汉字";
    String regex0="[\u4e00-\u9fa5]";
    Pattern p0=Pattern.compile(regex0);
    Matcher m0=p0.matcher(str0);
    boolean rs0=m0.find();
    System.out.println(rs0);

    /**
     * 二、提取
     * 
     */
    String regEx2=".+\\\\(.+)$";
    String str2="c:\\dir1\\dir2\\name.txt";
    Pattern p2=Pattern.compile(regEx2);
    Matcher m2=p2.matcher(str2);
    boolean rs2=m2.find();
    for(int i=1;i<=m2.groupCount();i++){
    System.out.println(m2.group(i));
    }
    /*
     * 以上的执行结果为name.txt,
     * 提取的字符串储存在m.group(i)中,
     * 其中i最大值为m.groupCount();
     */
    /**
     * 三、分割
     * 
     */
    String regEx3="::";
    Pattern p3=Pattern.compile(regEx3);
    String[] r3=p3.split("xd::abc::cde");
    System.out.println(Arrays.toString(r3));
    //执行后,r就是{"xd","abc","cde"}
    /*
     * 其实分割时还有更简单的方法:
     * String str="xd::abc::cde";
     * String[] r=str.split("::");
     */

    /**
     * 四、替换(删除)
     * 
     */
    String regEx4="a+"; //表示一个或多个a
    Pattern p4=Pattern.compile(regEx4);
    Matcher m4=p4.matcher("aaabbced a ccdeaa");
    String s4=m4.replaceAll("A");
    System.out.println(s4.toString());
    //结果为"Abbced A ccdeA"
    /*
     * 如果写成空串,既可达到删除的功能,
     * 比如:String s=m.replaceAll("");
     * 结果为"bbced  ccde"
     */
    }

    /**
     * 附:
     * \d 等於 [0-9] 数字 
     * \D 等於 [^0-9] 非数字 
     * \s 等於 [ \t\n\x0B\f\r] 空白字元 
     * \S 等於 [^ \t\n\x0B\f\r] 非空白字元 
     * \w 等於 [a-zA-Z_0-9] 数字或是英文字 
     * \W 等於 [^a-zA-Z_0-9] 非数字与英文字 
     * ^ 表示每行的开头
     * $ 表示每行的结尾  */


    }
      

  6.   

    1. 首先它不是“表达式”,不是你在 Java 中写的那些普通的表达式,它是一个描述另一个文本序列匹配模式的字符串。
    2. 有点像在 DOS 下 * 代表 0 或 0 个以上的字符,?代表 0 个或 1 个字符(SQL 中是 % _),但又远比它们灵活复杂和功能强大。
    3. ...
      

  7.   

    a98b   c0912d   c10b   a12345678d   ab
     
        我们仔细分析上面五个字符串,可以看出它们有一个共同特征,就是第一个字符必须是'a'或'c',最后一个字符必须是'b'或'd',而中间的字符是任意多个数字组成(包括0个数字)。因此,我们可以将这五个字符串的共同特点抽象出来,这就产生了一个正则表达式:[ac]\\d*[bd]。而根据这个正则表达式,我们可以写出无穷多个满足条件的字符串。
     
    在Java中使用正则表达式的方法非常多,最简单的就是和字符串一起使用。在String中有四个方法可以使用正则表达式,它们是matches、split、replaceAll和replaceFirst。
     
    一、matches方法
     
    matches方法可以判断当前的字符串是否匹配给定的正则表达式。如果匹配,返回true,否则,返回false。matches方法的定义如下:public boolean matches(String regex)
       
      如上面给出的正则表达式我们可以用如下程序验证。
     
    String[] ss = new String[]{"a98b", "c0912d",  "c10b",  "a12345678d",  "ab"};
    for(String s: ss)
        System.out.println(s.matches("[ac]\\d*[bd]"));
    输出结果:
     
    true
    true
    true
    true
    true
     
       下面简单解释一下这个正则表达式的含义。如果我们学过编译原理的词法分析,就会很容易理解上面的正则表达式(因为正则表达式的表示方法和词法分析中的表达式类似)。如在 [...]中的相当于或"|",如[abcd]相当于a|b|c|d,也就是a或b或c或d。如上面的正则表达式的开头部分是[ac],就代表着字符串的开头只能是a或c。[bd]表达字符串结尾只能是b或d。而中间的\d表达0-9的数字,由于\在正则表达式中有特殊含义,所以用\\来表示\。而*表示有0或无穷多个(这在词法分析中叫*闭包),由于*跟在\d后面,因此表达有0或无穷多个数字。
     
    二、split方法
     
    split方法使用正则表达式来分割字符串,并以String数组的形式返回分割结果。split有两种重载形式,它们定义如下:
     
    public String[] split(String regex)
    public String[] split(String regex, int limit)
        如下面的代码将使用split的第一种重载形式来分割HTTP请求头的第一行,代码如下:
     
    String s = "GET /index.html HTTP/1.1";
    String ss[] = s.split(" +");
    for(String str: ss)
    System.out.println(str);
    输出结果:
    GET
    /index.html
    HTTP/1.1
     
        在使用split的第一种重载形式时应注意,如果分割后的字符串最后有空串,将被忽略。如使用正则表达式\d来分割字符串a0b1c3456时,得到的数组的长度为3,而不是7。
    在split的第二种重载形式中有一个limit参数,要分三种情况讨论:
     
    1. 大于0: 如limit的值为n,那么将对正则表达式使用n-1次,下面的代码:String s = "a0b1c3456";
    String ss[] = s.split("\\d", 3);
    for(String str: ss)
        System.out.println(str);输出结果:
     
    a
    b
    c3456
     
    从输出结果可以看出,程序只对" a0b1c3456"使用了两次正则表达式,也就是在少扫描完字符'1'后,不管后面有没有满足条件的字符串,都将后面的字符串作为一个整体来作为返回数组的最后一个值。
     
    2. 小于0: 不忽略结尾的空串。也就是上面的例子返回数组的长度应该是7,而不是3。
    3. 等于0:这是默认值,相当于split的第一种重载形式。
     
     
    三、replaceAll 和 replaceFirst方法
     
    为两个方法的定义如下:
    public String replaceAll(String regex, String replacement)
    public String replaceFirst(String regex, String replacement)
     
      

  8.   

    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如: JScript VBScript 匹配 
    /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。 
    /\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。 
    /<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。 
    下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
    字符 描述 
    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 
    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 
    $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 
    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 
    + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 
    ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 
    {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 
    {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 
    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 
    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 
    (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 
    (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 
    (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 
    (?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 
    x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 
    [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 
    [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 
    [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 
    \B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 
    \cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 
    \d 匹配一个数字字符。等价于 [0-9]。 
    \D 匹配一个非数字字符。等价于 [^0-9]。 
    \f 匹配一个换页符。等价于 \x0c 和 \cL。 
    \n 匹配一个换行符。等价于 \x0a 和 \cJ。 
    \r 匹配一个回车符。等价于 \x0d 和 \cM。 
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 
    \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 
    \t 匹配一个制表符。等价于 \x09 和 \cI。 
    \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 
    \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 
    \W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 
    \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。. 
    \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 
    \n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 
    \nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 
    \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 
    \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (©)。 
    下面看几个例子:
    "^The":表示所有以"The"开始的字符串("There","The cat"等);
    "of despair$":表示所以以"of despair"结尾的字符串;
    "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
    "notice":表示任何包含"notice"的字符串。'*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或
    更多”,“一次或更多”还有“没有或一次”。下面是几个例子:"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
    "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
    "ab?":表示一个字符串有一个a后面跟着零个或者一个b;
    "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。也可以使用范围,用大括号括起,用以表示重复次数的范围。"ab{2}":表示一个字符串有一个a跟着2个b("abb");
    "ab{2,}":表示一个字符串有一个a跟着至少2个b;
    "ab{3,5}":表示一个字符串有一个a跟着3到5个b。请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'*','+'和
    '?'相当于"{0,}","{1,}"和"{0,1}"。
    还有一个'¦',表示“或”操作:"hi¦hello":表示一个字符串里有"hi"或者"hello";
    "(b¦cd)ef":表示"bef"或"cdef";
    "(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";'.'可以替代任何字符:"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
    "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);方括号表示某些字符允许在一个字符串中的某一特定位置出现:"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");
    "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");
    "^[a-zA-Z]":表示一个以字母开头的字符串;
    "[0-9]%":表示一个百分号前有一位的数字;
    ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表
    示两个百分号中不应该出现字母)。为了逐字表达,必须在"^.$()¦*+?{\"这些字符前加上转移字符'\'。请注意在方括号中,不需要转义字符。
      

  9.   

    正则表达式的语法
    http://blog.csdn.net/facepp/archive/2008/03/05/2148027.aspx
    正则表达式的使用
    http://blog.csdn.net/facepp/archive/2008/03/05/2148012.aspx
      

  10.   

    正则表达式30分钟入门教程
    http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm感觉这个东西不用研究的太多,知道原理就可以,用的时候到网上一搜就知道了。
    程序员脑袋里要装的东西太多了,能空出点地方就空出点地方。
      

  11.   

    Java Tutorial 上对于正则表达式的定义:
    Regular expressions are a way to describe a set of strings based on common characteristics
    shared by each string in the set.Mastering Regular Expressions 对正则表达式的定义:
    Regular expressions are the key to powerful, flexible, and efficient text processing. Regular 
    expressions themselves, with a general pattern notation almost like a mini programming language
    allow you to describe and parse text. With additional support provided by the particular tool
    being used, regular expressions can add, remove, isolate, and generally fold, spindle, and
    mutilate all kinds of text and data.Java Tutorial 上有关于 Java 正则表达式的教程(这还是 Java 所支持的正则表达式中最为基本的)
    http://java.sun.com/docs/books/tutorial/essential/regex/index.html译文:http://www.java2000.net/doc/Java.Regex.Tutorial/Java.Regex.Tutorial.html正则表达式中的符号就像密码般一样,各种符号比较多。它也跟 SQL 一样,入门很容易,
    要熟悉或者精通的话得花上一定的功夫。正则表达式有一点好处就是,学会后可以在所有支持正则表达式的程序设计语言中使用,
    几乎是通用的,仅仅是构建方式或者符号不一样而已。
      

  12.   

    正则表达式非常强大,看看下面这段解析 CSV 格式的代码就知道。我们都知道 CSV 的格式:
    1,每个字段采用逗号分隔;
    2,字段中若有逗号的话,则字段两边放上引号(");
    3,字段中若出现引号(")则采用两个引号("")表示,并在字段的两边放上引号(")简单的几条规则,如果使用纯粹的字符串来进行处理的话,难道是比较大的。看看正则表达式是如何处理的下面的这个正则表达式是世界级顶尖的正则表达式高手写的,已经高度优化过了,
    普通人是很难做到的。import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {       public static void main(String[] args) {
            String str = "dw,\"kk,ll\",\",yioi\",iu,\",\",r3,\"\"\"fte\",l,\"kk\"\"ll\",mm'oo,\"n\"\"dw,erw\"\",e\",, ";
            String regex = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))";
            Matcher main = Pattern.compile(regex).matcher(str);
            Matcher mquote = Pattern.compile("\"\"").matcher("");
            while (main.find()) {
                String field;
                if (main.start(2) >= 0) {
                    field = main.group(2);
                } else {
                    field = mquote.reset(main.group(1)).replaceAll("\"");
                }
                System.out.println("Field [" + field + "]");
            }
            System.out.println("解析后应产生的字符串:\n" +
                    "dw\n" + "kk,ll\n" + ",yioi\n" + "iu\n" +
                    ",\n" + "r3\n" + "\"fte\n" + "l\n" +
                    "kk\"ll\n" + "mm'oo\n" + "n\"dw,erw\",e");
        }
    }转引自 Jeffrey E.F.Friedl, Mastering Regular Expressions, 3rd ed.,
           8.9.1. Parsing Comma-Separated Values (CSV) Text.
    原文的表达式是采用行内嵌注释模式书写的,这里将其合并了。像这种表达式建议大家收藏一下备用。