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);
这句实在是 查都没地方查 非常困惑?
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);
这句实在是 查都没地方查 非常困惑?
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 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+)。
is是下面两个单词的缩写
IGNORECASE就是忽略大小写
SINGLELINE就是规定特殊字符(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)
自己去看
有complier和pattern两种
你那正则再pattern里面看
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