java模式获取带扩展名的pagename

时间:2012-02-29 20:36:43

标签: java regex

对于URL http://questions/ask/stackoverflow.xhtml,要求是获取stackoverflow。 用于获取此页面名称的模式是什么? 可以使用子字符串,但我读到模式匹配器的性能会更好。

2 个答案:

答案 0 :(得分:2)

我猜想正则表达式解决方案会更复杂(并且可能更慢)。如果没有它们,我就会这样做:

public static String getFilename(String s) {
  int lastSlash = s.lastIndexOf("/");
  if (lastSlash < 0) return null;
  int nextDot = s.indexOf(".", lastSlash);
  return s.substring(lastSlash+1, (nextDot<0) ? s.length() : nextDot);
}

String url = "http://questions/ask/stackoverflow.xhtml";
getFilename(url); // => "stackoverflow"

当然,如果URL没有文件名,那么您将获得主机名。您可能最好解析URL,解压缩文件的一部分,然后删除路径和扩展名。像这样:

public static String getFilename2(String s) {
  URL url = null;
  try {
    url = new URL(s);
  } catch (MalformedURLException mue) { return null; }
  String filePart = url.getFile();
  if (filePart.equals("")) return "";
  File f = new File(filePart);
  String filename = f.getName();
  int lastDot = filename.lastIndexOf(".");
  return (lastDot<0) ? filename : filename.substring(0, lastDot);
}

答案 1 :(得分:1)

对于该特定网址,您可以使用:

String url = "http://questions/ask/stackoverflow.xhtml";
String pname = url.split("/")[4].split("\\.")[0];

对于更有用(就正则表达而言不是性能而言)基于模式的解决方案考虑这一点:

String url = "http://questions/ask/stackoverflow.xhtml";
Pattern pt = Pattern.compile("/(?![^/]*/)([^.]*)\\.");
Matcher matcher = pt.matcher(url);
if(matcher.find()) {
    System.out.println("Matched: [" + matcher.group(1) + ']');
    // prints Matched: [stackoverflow]
}