java中模式的字符串比较

时间:2014-03-04 12:34:34

标签: java regex pattern-matching

假设我有一个字符串模式

/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()吗?

2 个答案:

答案 0 :(得分:1)

您要寻找的模式是\{[^\{]+\}。它用大括号搜索任何东西。

一个想法是将您的源模式转换为包装器对象,该对象存储已编译的模式(转义除变量之外的所有内容)以及每个变量的名称。


修改 对于您的情况,示例如下所示:

首先,为Rangeint创建一个包含两个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
    }