【问题标题】:String comparision of patterns in javajava中模式的字符串比较
【发布时间】:2014-03-04 12:34:34
【问题描述】:

假设我有一个字符串模式

/users/{id}

我得到的网址可能是

/users/1  
/users/abc123
/users/etc

我的意思是动态的,所以我有 2 个变量。

String dynamicPathPattern = "/users/{id}";
String dynamicPath = "/users/1";

/*
 Something that will convert string pattern to regular expression. And compare it.
*/

现在我的问题是如何比较这个?
我认为正则表达式是可能的。谁能指导一下我应该如何开始?
有没有像String.equals() 这样的现成可用的东西?

【问题讨论】:

  • 你想在字符串中比较什么?你在找什么?
  • 您的问题仅与“/users/{id}”形式有关,还是您是否在询问任何使用大括号来描述您想要匹配的内容的模式?
  • 我想比较匹配该模式的字符串。两者都是动态的,所以我需要将模式转换为 regx 以便我可以比较它。
  • @ErstwhileIII 任何大括号 {} 形式的模式,例如 /friends/{id}/{friends_id}
  • 你只有这样的路径片段吗?即,没有嵌入/?另外,参数中可以有任何(编码的)空格吗?

标签: java regex pattern-matching


【解决方案1】:

您正在寻找的模式是\{[^\{]+\}。它搜索大括号中的任何内容。

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


编辑: 对于您的情况,示例如下所示:

首先,创建一个类Range,其中包含两个int 用于startend。然后确定来自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]+,从您的模式中创建一个新的正则表达式。然后,您可以简单地编译一个模式并在输入字符串上创建一个匹配器,如上所述。

【讨论】:

  • 我希望它适合动态模式。
  • “动态模式”是什么意思?您首先使用我上面提到的模式来查找所有出现的大括号变量。然后,您从输入模式 test/hello/{example}/ 生成一个正则表达式,例如,它看起来像 test/hello/([a-zA-Z]+)/。然后你可以在你的输入字符串上匹配这个表达式,并得到每个组的值。
  • 哦,是的,这正是我想要的,你能给出一个可以进行生成和比较的sn-p吗?我也在尝试。
  • 我已编辑问题并添加了您必须采取的步骤。 ;) @VivekMuthal 如果这回答了您的问题,请将其标记为已接受的答案。
  • 不,这只是比较了模式。我刚刚找到了发布它的解决方案。
【解决方案2】:

在尝试了很多 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
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 2014-11-11
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多