正则表达式在URL的斜杠之间获取字符串

时间:2018-04-18 09:14:02

标签: java regex string split

在我的网站中,用户输入的网址为http://mydomain/shirt/abc等。我需要将abc作为关键字(如下面给出的逻辑)。 String utils可以实现。我认为正则表达式会更容易,但我并不好。

Java代码

    String testURLs[] = {"", "/" ,"/shirt", "/shirt/", "/shirt/abc", "/shirt/abc/", "/shirt/abc/xyz", "/shirt/abc?x=y", "/shirt/xyz/abc/pqr",
                            "abc/something", "/abc/some", "abc/shirt/something"};

    for(String x : testURLs){
    System.out.println(x + " --> " +getRelativeWebappURL(x));
    }

private String getAppNameFromURL(String userEnteredURL){
    String uri = userEnteredURL.replaceFirst("/shirt/","");
    int index = uri.indexOf("/");
    if(index == -1 || index == 0){
        return null;
    }
    return uri.substring(0,index);
}

输出:(预期)

 --> NULL
/ --> NULL
/shirt --> "" (empty string)
/shirt/ --> "" (empty string)
/shirt/abc --> abc
/shirt/abc/ --> abc
/shirt/abc/xyz --> abc
/shirt/abc?x=y --> abc
/shirt/xyz/abc/pqr --> xyz
abc/something --> NULL
/abc/some --> NULL
abc/shirt/something --> NULL

从字面上看,预期的逻辑是:

  • /shirt/
  • 之后获取字符串
  • 如果以""开头? (空字符串) - 返回NULL
  • 如果以" /&#34开头; - return NULL
  • 如果以" / shirt /&#34开头; - 返回"" (空字符串)
  • 如果以" /衬衫"开头 - 返回"" (空字符串)
  • 如果以" /衬衫开头?" - 返回"" (空字符串)
  • 如果以" / shirt /?"开头? - 返回"" (空字符串)
  • 如果以" / shirt / abc"开头? - return abc
  • 如果以" / shirt / xyz /&#34开头; - 返回xyz
  • 如果以" / shirt / xyz / abc"开头? - 返回xyz

有没有办法用正则表达式做到这一点?

我尝试使用正则表达式但是失败了!!

2 个答案:

答案 0 :(得分:0)

是的!

shirt\/(\w+) 

是你需要的。

private String getAppNameFromURL(String userEnteredURL){
    Pattern p = Pattern.compile("shirt\/(\w+)");
    Matcher m = p.matcher(userEnteredURL);
    if(m.find()){
        return m.group(1);
    }
    return null;
}

这将始终为您提供衬衫后的第一个路径参数。如果它是一个单词,并且不以数字或任何其他非字母字符开头。

同时检查https://regexr.com/3o3jm 您可以在此处放置预期的逻辑以检查正则表达式。

答案 1 :(得分:0)

感谢大家有时间提供帮助。最后,我从你的所有输入中得到了一个确切的想法。

这是 DEMO

private static String getAppNameFromURL(String userEnteredURL){
    if(userEnteredURL!=null && !userEnteredURL.startsWith("/shirt")){
        return null;
    }
    Pattern p = Pattern.compile("^/shirt/([^?]([^\\?/]+|.*))");
    Matcher m = p.matcher(userEnteredURL);
    if(m.find()){
        return m.group(1);
    }
    return "";
}

输出:

empty string-->null
/-->null
/shirt--> empty string
/shirt/--> empty string
/shirt/abc-->abc
/shirt/abc/-->abc
/shirt/abc/xyz-->abc
/shirt/abc?x=y-->abc
/shirt/xyz/abc/pqr-->xyz
abc/something-->null
/abc/some-->null
abc/shirt/something-->null