import java.util.regex.Matcher;
import java.util.regex.Pattern;public class B { public static void main(String[] args) {
String s = "ab,cde,ggg\r\ng;" ;
Pattern p = Pattern.compile(".+?[;,]");
Matcher m = p.matcher(s);
while(m.find()){
System.out.println( m.group() );
}
}
}
运行结果:
ab,
cde,
g;这里,s中的\r\n前面的三个g没有了,只得到\r\n后面那个,我想要ggg\r\ng这个也能完整保留下来
怎么办?谢谢!

解决方案 »

  1.   

    // RegEx
    String s = "ab,cde,ggg\r\ng;" ; String pattern = "((.|[\r\n])+?)[;,]";
    Pattern p = Pattern.compile(pattern,Pattern.MULTILINE);
    Matcher m = p.matcher(s);
    while(m.find()){
    System.out.println("["+ m.group() +"]");
    }
      

  2.   

    注意输出里面的[ 和 ],因为\r 和\n表示换行,所以作为字符是不显示的,但是已经匹配了如下修改输入字符串,可以得到你需要的,呵呵 // RegEx
    String s = "ab,cde,ggg\\r\\ng;" ; String pattern = "((.|[\r\n])+?)[;,]";
    Pattern p = Pattern.compile(pattern,Pattern.MULTILINE);
    Matcher m = p.matcher(s);
    while(m.find()){
    System.out.println("["+ m.group() +"]");
    }
    System.out.println("<Start>"+s+"<End>");
      

  3.   

    谢谢 DarrenWang(达伦) ,但是我把你那个[\r\n]替换成$为什么不行?
      

  4.   

    其实你自己写的就差不多了,我只不过在你的基础上加上了你少的东西,因为.默认不包括换行。
    只要在Pattern.compile的时候,加上Pattern.DOTALL的选项,那么你的那个也可以正常运行。
    至于你将$替换掉[\r\n]之后为什么不行,我想是语义不同吧(好久不用regex了,既不太清楚了)
      

  5.   

    跟同事问了一下,打个比方吧:
    aaaaaaaaaaaaaaaa\r\n
    这个算是一行,我如果将$替换为b的话
    那么,上一行就会变成aaaaaaaaaaaaaaaab\r\n
    这样你就会看清楚了,$是在\r\n之前和该行最后字符之间这个位置,也就是说$和\r\n的语义是不一样的
    呵呵,这回应该讲清楚了吧?!
      

  6.   

    弱弱的问 DarrenWang(达伦) :
    (.|[\r\n])+?

    [.\n]+?有什么不同?
      

  7.   

    只是为了表示清楚以上问题,直接[.\r\n]也是可以的,但是,因为unix和window下面的换行不同,所以直接[.\n]这样写确切的说,不是对所有的平台语义都一样的。
    以上
      

  8.   

    (.|[\r\n])+?

    [.\n]+?我的运行结果不一样,why?
    结果:
    1
    [ab,]
    [cde,]
    [ggg
    g;]2
    [
    ]
    这是为什么呢?
      

  9.   

    写错了,
    当pattern = "[.\n]+?[;,]";的时候,什么结果也没有?
      

  10.   

    看着眼晕,
     另一个问题 问号和尖括号在regex中怎么表示?
      

  11.   

    不好意思打扰一下:
    有兴趣一边上网一边赚钱吗?,赚的还是美元呢。
    您想轻松做兼职,超过自己的薪水!!
    这绝对是真实的,cctv-10都报道了它的可信性!
    特别是上班时能上网的朋友,只要能上网就能赚钱,不用你费心
    详情请登陆http://freemoneycn.home4u.china.com/
    立即注册http://www.cashfiesta.com/php/join.php?ref=freemoneynj
      

  12.   

    现在解说不同,呵呵
    假设一下是匹配内容:aaaaaaa回车
                        bbbbbbb回车1-如果以[.\n\]来连续find的话,那么这种pattern最终只能匹配所有的回车字符;
    2-如果以(.|\n)来连续匹配并find的话,那么这种pattern匹配以上内容的所有字符,即,单个的a,b以及回车;
    3-改用[a-z\n]来匹配的话,与第二种方法匹配结果相同;
    4-改用第一种pattern匹配“aaaa.bbbb回车”内容,则会匹配内容中的"."和“回车”
    所以,最终得出结论,"."在[] 里面已经失去其代表所有除了回车以外字符的意义,而纯粹就是代表"."。
    故此得出结论,二者语义不同。对于"toppi(从天而降) "的问题,你可以在指定pattern的时候,直接用\Q和\E将你的pattern包裹起来,这样,不过什么字符,在pattern中都会保持其原来的意义,也就是.还是.,\ 还是\。OK,以上。