假设我有一个字符串模式
/users/{id}
我得到的网址可能是
/users/1
/users/abc123
/users/etc
我的意思是动态,所以我有两个变量。
String dynamicPathPattern = "/users/{id}";
String dynamicPath = "/users/1";
/*
Something that will convert string pattern to regular expression. And compare it.
*/
现在我的问题是如何比较这个?
我认为正规表达是可能的。任何人都可以指导我应该如何开始?
我可以使用String.equals()
吗?
答案 0 :(得分:1)
您要寻找的模式是\{[^\{]+\}
。它用大括号搜索任何东西。
一个想法是将您的源模式转换为包装器对象,该对象存储已编译的模式(转义除变量之外的所有内容)以及每个变量的名称。
修改强> 对于您的情况,示例如下所示:
首先,为Range
和int
创建一个包含两个start
的班级end
。然后确定yourPatternString
:
Pattern variablePattern = Pattern.compile("\\{[^\\{]+\\}");
Matcher variableMatcher = variablePattern.matcher(yourPatternString);
List<Range> variableRanges = new ArrayList<>();
while(variableMatcher.find()) {
variableRanges.add(new Range(variableMatcher.start(), variableMatcher.end()));
}
现在,使用这些范围,您可以通过使用例如[a-zA-Z]+
替换每个范围,从模式中创建新的正则表达式。然后,您可以简单地编译模式并在输入字符串上创建匹配器。
答案 1 :(得分:0)
用regx尝试了很多。这是满足所有需求的代码。我希望它也会帮助其他人。
String[] dynamicPathArray = dynamiPathPattern.split("/");
String generatedPattern = "";
for (int j = 1; j < dynamicPathArray.length; j++) {
if (dynamicPathArray[j].contains("{")) {
dynamicPathArray[j] = "[\\w\\s.-]+";
} else {
dynamicPathArray[j] = "\\b" + dynamicPathArray[j] + "\\b";
}
generatedPattern = generatedPattern + "/" + dynamicPathArray[j];
}
Pattern variablePattern = Pattern.compile(generatedPattern);
Matcher variableMatcher = variablePattern.matcher(dynamicPath);
if (variableMatcher.find()) {
//Do whatever needed
}