java 字符串替换

在java中有没有类似或者相关的方法
例如 :
String a = "/user/update/{userid}";
String b = "/user/update/123";
有个方法接受这两个参数,然后返回一个 Map, key 是 userid, value 是 123
如果这两个字符串不匹配返回 null.

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class Demo {

    public static void main(String[] args) {
        print("/user/{method}/{userid}.jsp", "/user/update/123.jsp");
    }

    private static void print(String text, String text2) {
        Map<String, String> map = findMap(text, text2);
        for (Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }

    public static Map<String, String> findMap(String text, String text2) {
        Map<String, String> map = new HashMap();
        String[] split = text.split("/");
        String[] split2 = text2.split("/");
        if (split.length != split2.length) {
            return null;
        }
        for (int i = 0; i < split.length; i++) {
            if (!split[i].equals(split2[i])) {
                removePrefix(split, split2, i);
                removeSuffix(split, split2, i);
                if (split[i].matches("\\{.*\\}")){
                    split[i] = split[i].substring(1, split[i].length() - 1);
                    map.put(split[i], split2[i]);
                }
            }
        }
        return map;
    }

    private static void removePrefix(String[] arr, String[] arr2, int i) {
        for (int j = 1; j < arr[i].length(); j++) {
            if (!arr2[i].startsWith(arr[i].substring(0, j))) {
                arr[i] = arr[i].substring(j - 1);
                arr2[i] = arr2[i].substring(j - 1);
                break;
            }
        }
    }

    private static void removeSuffix(String[] arr, String[] arr2, int i) {
        for (int j = arr[i].length(); j > 0; j--) {
            if (!arr2[i].endsWith(arr[i].substring(j))) {
                int length = arr2[i].length() - arr[i].length();
                arr[i] = arr[i].substring(0, j + 1);
                arr2[i] = arr2[i].substring(0, j + 1 + length);
                break;
            }
        }
    }

}

//程序输出
userid : 123
method : update

程序思路:

先按照/把字符串分成几分,然后找到不一致的,掐头去尾,就得到结果了。

追问

java 里面的正则竟然这么坑爹 "\\{.*\\}"

追答

java的正则确实比较坑爹。
因为原先java不支持正则,但是字符串本身的转义就是\
然后正则的转义也是\
这就造成这种正则"\\\\\\w+"

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-12
java的String截取还是比较高效的,至少比正则高效很多
第2个回答  2013-09-12
用lastIndexOf截取,得到两段的处理.这种操作可以不需要考虑性能的
第3个回答  2013-09-12
这个是可以直接运行的,经测试OK的。。
=============-===================-=====================

package com.aa20130813;

import java.util.HashMap;

public class bb0912 {
static HashMap<String, String> mm =null;//声明map==
public static void main(String[] args) {

mm = new HashMap<String,String>();//实例化一下===
String m = "/user/update/{userid}";
String n = "/user/update/123";

new bb0912().aa(m,n);//调用下面的方法【给它2个字符串,他返回一个map】==
}

HashMap<String, String> aa(String m,String n) {

String m2 = m.replace("{",",");//先把{替换为,【因为正则表达式什么的】===
String ss[]= m2.split(",");//根据,拆分字符串====
String mubiao = ss[1].substring(0,ss[1].length()-1);//第二个字符串去掉最后一个字符的===
System.out.println(mubiao);//打印出userid
String n2 = n.replace("/",",");//先把{替换为,【因为正则表达式什么的】===
String kk[]= n2.split(",");//根据,拆分字符串====
System.out.println(kk[3]);//很明确就是打印第四个子字符串123====

mm.put(mubiao, kk[3]);//把键值对字符串添加到map里==
System.out.println(mm);//打印出这一个map对象{userid=123}
return mm;//返回这个map对象==

}

}
第4个回答  2013-09-12
/user/update/ 这一部分固定,可以用来计算截取index

substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
split(String regex)
根据给定正则表达式的匹配拆分此字符串。
相似回答