关于正则一些探究

还是源于面试中提到了正则表达式。当时就是脑子一片麻木,压根去思考过,都是搜索一下然后套进去发现可以用,就直接用了。
感觉这样是不对的,至少还是要思考一下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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值