Java 正则表达式Matcher 类使用

问题

字符串中替换某一个子串。
用到的jar:guava 16.0.1

代码

public class TemplateUtils {

    private static Pattern patternForVariable = Pattern.compile("\\$\\{(\\w+)\\}", Pattern.CASE_INSENSITIVE);

    /**
     * 简单的表达式替换 <br>
     * e.g.
     * <pre>
     *     Map<String,Object> map = new HashMap<String, Object>();
     *     map.put("name","Tom");
     *     String result = TemplateUtils.format("My name is ${name}", map);
     *     assertThat(result).isEqualTo("My name is Tom");
     * </pre>
     *
     * @param template ${key} as variable
     * @param context  variable name and values
     * @return
     */
    public static String format(String template, Map<String, Object> context) {
        StringBuffer accum = new StringBuffer();
        Matcher matcher = patternForVariable.matcher(template);
        while (matcher.find()) {
            String key = matcher.group(1);
            Preconditions.checkNotNull(context.get(key), "Key \"" + key + "\" must not be null");
            matcher.appendReplacement(accum, String.valueOf(context.get(key)));
        }
        matcher.appendTail(accum);
        return accum.toString();
    }

    public static void main(String args[]){

        Map<String, Object> context = new HashedMap();
        context.put("outBizID", 24291947);
        String url = "http://kp.dper.com/rocshop/shopInfo/view?shopId=${outBizID}ddd";
        String str =  format(url,context);
        System.out.println(str);
    }
}

运行结果
http://kp.dper.com/rocshop/shopInfo/view?shopId=24291947ddd

group()

* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。

public class Main{  
        public static void main(String[] args){  
                long start = System.currentTimeMillis();  
                Scanner in = new Scanner(System.in);  

                //开始正则  
                String Line = "abcdefg";  
                String regular = "(b)([\\s\\S]+?)(f)";  
                System.out.println(getRegular(Line, regular).get(0));  
                //结束正则  

                long end = System.currentTimeMillis();  
                System.out.println("\n用时:"+(end-start)/1000f+"秒");  
        }  

        private static List<String> getRegular(String line, String regular) {  
                List<String> code = new ArrayList<String>();  

                Pattern pattern = Pattern.compile(regular);  
                Matcher matcher = pattern.matcher(line);  
                while(matcher.find()){  
                        code.add(matcher.group(1));//问题是这里的group的参数  
                }  
                return code;  
        }  
}  

这里的捕获组数,简单来说就是,正则表达式中有多少个括号,通过groupCount()获取捕获组数
group()和group(0)等价,就是把所有的组数一起获取,在上面的例子中,正则出来的结果是:bcdef
group(1)表示的是获取第一组,也就是第一个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:b
group(2)表示的是获取第二组,也就是第二个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:cde
group(3)表示的是获取第三组,也就是第三个括号中的正则出来的字符串,在上面的例子中,正则出来的结果是:f

值得注意的是group()会出现越界问题,要注意。第一个例子 group(2)越界,第二个例子group(4)越界。

appendTail()/appendReplacement()

如果没有appendTail,运行结果:
http://kp.dper.com/rocshop/shopInfo/view?shopId=24291947
StringBuffer appendTail(StringBuffer sb)将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。

appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里,而 appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。

例子

有字符串 fatcatfatcatfat, 假设既有正则表达式模式为”cat”,第一次匹配后调用 appendReplacement(sb,”dog”), 那么这时 StringBuffer sb 的内容为 fatdog,也就是 fatcat 中的 cat 被替换为 dog 并且与匹配子串前的内容加到 sb 里,而第二次匹配后调用 appendReplacement(sb,”dog”),那么 sb 的内容就变为 fatdogfatdog,如果最后再调用一次 appendTail(sb), 那么 sb 最终的内容将是 fatdogfatdogfat

find()/matches()

  1. find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数。
  2. matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数字类型或其他类型,一般要用matches()。
    matches() 尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。返回boolean
Pattern.matches("b*g","bbg") //返回true
//或者
Pattern pattern = Pattern.compile("^\\d+\\s*(\\s*,?\\s*\\d+)*,?\\s*$");
Matcher matcher = pattern.matcher("2396591 44010008, 33");
System.out.println(matcher.matches());  //返回true

参考:
https://my.oschina.net/u/1458577/blog/208865
http://www.ibm.com/developerworks/cn/java/l-regp/part2/(详细介绍Matcher 类 )
http://blog.csdn.net/u012956540/article/details/46819435
http://www.runoob.com/regexp/regexp-syntax.html
https://zhidao.baidu.com/question/560695602593266404.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值