import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Bao110 {
    
    public static void main(String[] args) {
        String str ="sad1fs1df<B>11</B>sd1f1s<B>11</B>df";
        
        String s = replace(str, "<b>.*?</b>", "1", "2");         
        System.out.println(s);
    }
    
    public static String replace(String str, String exclusionRegex, String orignalRegex, String replacement) {
        Pattern pattern = Pattern.compile("((?is:" + exclusionRegex + "))|" + orignalRegex);
        Matcher matcher = pattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            if(matcher.start(1) >= 0) {
                matcher.appendReplacement(sb, "$1");
            } else {
                matcher.appendReplacement(sb, replacement);
            }
        }
        matcher.appendTail(sb); 
        return sb.toString();
    }
}
Pattern pattern = Pattern.compile("((?is:" + exclusionRegex + "))|" + orignalRegex);
这句实在是 查都没地方查 非常困惑?

解决方案 »

  1.   

    这是火龙果回复一个帖子的内容,希望对你有帮助,我也在看,没有实践,所以没法解释。以 (? 开头,) 结尾的都称为非捕获组,在匹配完成后在内存中不保留匹配到的字符。 非捕获组的应用比较复杂,这里只能简单地说一下它们的意思。 (?:X) X,作为非捕获组 
    与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本, 
    仅仅作为分组。 
    比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配 
    123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留,区别仅在于此。 (?idmsux-idmsux)  Nothing,但是将匹配标志i d m s u x on - off 
    用于标志匹配,比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配 
    不区分大小地进行匹配,(?-i) 关闭标志,恢复不区分大小写,这时的 def 只能匹配 def (?idmsux-idmsux:X)  X,作为带有给定标志 i d m s u x on - off 
    与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def) (?=X) X,通过零宽度的正 lookahead 
    (?!X) X,通过零宽度的负 lookahead 
    (?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为 
    ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。 
    (?!X) 表示当前位置后面不允许出现的字符 (? <=X) X,通过零宽度的正 lookbehind 
    (? <!X) X,通过零宽度的负 lookbehind 
    这两个与上面两个类似,上面两个是向后看,这个是向前看 (?>X) X,作为独立的非捕获组 
    匹配成功不进行回溯,这个比较复杂,也侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。
      

  2.   

    还是有地方可以查的,火龙果的资源里面有他整理的 正则表达式 手册
    is是下面两个单词的缩写
    IGNORECASE就是忽略大小写
    SINGLELINE就是规定特殊字符(?idmsux-idmsux:X)  X,作为带有给定标志 i d m s u x on - off 
    与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def) 
      

  3.   

    java.util.regex
    自己去看
    有complier和pattern两种
    你那正则再pattern里面看
      

  4.   

    常  量                  等价的内嵌标志表达式 
    Pattern.CANON_EQ                没有 
    Pattern.CASE_INSENSITIVE       (?i) 
    Pattern.COMMENTS               (?x) 
    Pattern.MULTILINE                (?m) 
    Pattern.DOTALL                (?s) 
    Pattern.LITERAL               没有 
    Pattern.UNICODE_CASE          (?u) 
    Pattern.UNIX_LINES           (?d) 如果我没看错的话 这?s  是Pattern.DOTALL   
    而不是什么  SINGLELINE就是规定特殊字符 但是至少 弄清了 ?is  的意思了 , 实际上就是?i   + ?s