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+"