刚才看到个帖子:
如下:去掉[zz] [/zz]中间的字符
当然,[zz]是可以自定义的。可以换成[xieti] [/xieti]str="[zz]neighboring [/zz]Jing'an districe";完后有人给出解答:
final String str = "[zz]neighboring [/zz]Jing'an districe";
        final String regex = "(.*\\[zz\\]).*(\\[/zz\\].*)";
        System.out.println(str.replaceAll(regex, "$1$2"));
我现在有几个地方不明白:1. .*代表什么?貌似.代表一个任意字符,而*代表0个或多个字符,那也就是说.*还是代表0个或多个字符(跟*一样),如果是这样的话,我把.*改成了\\*为什么就匹配不了了呢?
2. 这正则里面有2个括号,这是干什么的?
3. $1$2是什么意思?

解决方案 »

  1.   

    1. 点(.)匹配除“\n”之外的任何单个字符,注意是单个
       *是零次或多次匹配,.*确实是匹配0个或多个字符,
     \\*成转义了,就只是一个真实的*号,
      String str = "*aa";
      System.out.println(str.replaceAll("\\*",""));
    可以用这个看看实际效果
    2 3可以一起回答,加括号是为了引用正则表达式里面的内容
    $1表示第一个括号里面的内容,$2表示第二个,依次类推
      

  2.   


    如果你的标签字母个数大致知道,那么还可以这样,\\1 \\2,$1 $2这些其实都是引用你的匹配组匹配到的内容。\\1 \\2 这种写法是在同个正则式里面“先抓到了,后面就可以引用”,比如下面的在第一轮替换时候\\1,就是1号匹配组([^\\]]{1,10}?)匹配到的zz,第二轮,\\1就是1号匹配组([^\\]]{1,10}?)匹配到的wahaha。$1,$2也是表示1号匹配组,2号匹配组这个意思,也是表示匹配到的内容,不过是在正则式外边引用。
        final String str = "[zz]neighboring [/zz]Jing'an districe[wahaha]ssdfsdfsdf[/wahaha]";
        final String regex = "(?<=\\[([^\\]]{1,10}?)\\])(.*)(?=\\[/\\1\\])";
        System.out.println(str.replaceAll(regex, ""));
      

  3.   

    楼主给的正则例子,写正则的人会一些正则的语法规则,但不是很了解正则的匹配过程,只考虑了可用性,没有考虑效率看楼主的例子是保留[zz][/zz]的
    String str = "[zz]neighboring [/zz]Jing'an districe";
    String regex = "(?i)(?<=\\[zz\\])[^\\[]*(?=\\[/zz\\])";
    System.out.println(str.replaceAll(regex, ""));如果不保留
    String str = "[zz]neighboring [/zz]Jing'an districe";
    String regex = "(?i)\\[zz\\][^\\[]*\\[/zz\\]";
    System.out.println(str.replaceAll(regex, ""));其它的都属于基本的正则语法规则,各种资料中都有介绍,就不详细解释了
    也可以去我的博客看看,虽然.NET介绍得多些,但基本语法规则还是通用的
      

  4.   


    String str = "[zz]neighboring [/zz]Jing'an districe";
    String regex = "(?i)(?<=\\[zz\\])[^\\[]*(?=\\[/zz\\])";
    System.out.println(str.replaceAll(regex, ""));
    试着对5楼进行一下解释 
    0宽度的非捕获组中的4种 (还是容易理解的)
    (?=X):后跟X
    (?!X) 后不跟X
    (?<=X)前面是X
    (?<!X) 前面不是X
    1 (?i) 这是一个非捕获组,代表本Pattern是不区分大小写的
    2 (?<=\\[zz\\])  代表本Pattern的前面是[zz] 注意:由于'['和']'在代表Pattern的字符串中有特别的含义所
                   以要用\转义成\\[  .   只有一个\也是不成的,因为\本身也需要转义
    3 [^\\[]*    这里一定要看仔细哦.我刚一开始也看晕了.我们知道 [a]代表一个字符a.  [^a]代表除了a之外         的其他任何字符 .\\[是转义,那么整个含义就清楚了.不是[的任何其他字符,这样的字符有多少个呢.用*代表-->0个或多个
    4(?=\\[/zz\\]) 又是一个非捕获组,含义还是清楚的.就是本Pattern的后面是[/zz].注意转义就OK
    5 tr.replaceAll(regex, "")  替换的时候就清楚了.替换成空就OK,也就是把本注释的第3条替换成空字符串.   完整的来一次把向前是[zz]向后是[/zz]中间的所有内容替换成"",并且中间的内容不能含有字符'['
    恩..希望我表达得还算清楚
      

  5.   

    对于正则表达式表示不理解。学习ing
      

  6.   

    最简单,又通用的来了。String str = "[zz]neighboring [/zz]Jing'an districe";
    String regex = "](.*?)\\[";
    System.out.println(str.replaceAll(regex, "]["));