还是源于面试中提到了正则表达式。当时就是脑子一片麻木,压根去思考过,都是搜索一下然后套进去发现可以用,就直接用了。
感觉这样是不对的,至少还是要思考一下java代码部分。
方式一:java.util.regex包下的Pattern和Matcher两个类
Pattern 类的实例采用类似于 Perl 的语法来表示以字符串形式指定的正则表达式。一个Pattern是一个正则表达式经编译后的表现模式。
Matcher 类的实例用于匹配字符序列与给定模式。通过 CharSequence 接口将输入提供给匹配器,以支持从多种输入源到字符的匹配。
String htmlStr="aaaa<script>asdsdwerewr</script>bbbbbb";
String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
Matcher m_script = p_script.matcher(htmlStr);
htmlStr = m_script.replaceAll(""); // 过滤script标签
System.out.println(htmlStr);
方式二:String 下的replace()和replaceAll()
String htmlStr="aaaa<script>asdsdwerewr</script>bbbb<script>23232aa</script>";
String regEx_script="<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
System.out.println(htmlStr.replaceAll(regEx_script, " "));
System.out.println("replace "+htmlStr.replace("aa", "cc"));
System.out.println("replaceAll "+htmlStr.replaceAll("aa", "cc"));
replaceAll()可以匹配正则表达式也能根据字符串去匹配并进行替换。跟踪replaceAll()代码就可以看到
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
replace()只是单纯的去匹配字符串,如果一直就进行替换。跟踪replace()代码可以看到
public String replace(CharSequence target, CharSequence replacement) {
//LITERAL 原义
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
面试官当时还问到,replaceAll()使用的时候是否会出现什么问题,我当时没有想到String里的replaceAll()方法也能进行正则匹配,只使用过Pattern和Matcher这种,当时一直都没想起里面有replace()这个,好吧只能怪自己抗压能力不行啊。
言归正传,既然面试官问了replaceAll()是否遇到过什么问题,那么这个方法使用的时候肯定有些注意事项的。通过查看一些文章发现了其中的问题。
跟踪replaceAll()继续跟踪Macher.replaceAll()然后跟踪到appendReplacement(),可以看到以下代码
if (nextChar == '\\') {
cursor++;
if (cursor == replacement.length())
throw new IllegalArgumentException("character to be escaped is missing");
nextChar = replacement.charAt(cursor);
result.append(nextChar);
cursor++;
}
这段源码很明确的表示,如果发现'\\'就会跳过,并添加后一个字符
如果是"\\\\"那么遇到'“\\”时候就会进入改方法,并将游标后移将'\'添加到字符串中,游标继续后移。
因此"\\\\"的结果是"\\"
问题:String s = "\\\\"; 替换成 String sr = "\\\\\\";
String s = "aaa\\\\bbb";
String sr1 = s.replaceAll("\\\\", "\\\\\\\\\\\\");
System.out.println("sr1:"+sr1);
问题:String s = "Jack is Rose's boyfriends." 使用$分组替换功能 替换成 String sr = "Rose is Jack's girlfriends."
String sr = "Rose is Jack's girlfriends." ;
String sr2=sr.replaceAll("(Rose) is (Jack)'s girlfriends","$2 is $1 boyfriends");
System.out.println("sr2:"+sr2);
问题:将单反斜杠替换成美元符,如何实现? 即String s = "\\"; 替换成 String sr = "$";
String sr = "\\" ;
String sr2=sr.replaceAll("\\\\","\\$");
System.out.println("sr2:"+sr2);
结论:
replaceAll中第二个参数replacement中,\有转义的作用,$用于获取分组匹配的当前子字符串
参考资料:
http://my.oschina.net/shipley/blog/98973