使用统一资源标识符 ( URI ) 是一种常见操作,主要用于Web 开发和文件管理。
此外,最常见的需求之一是获取 URL 中的最后一个路径段(最后一个段是最后一个“/”字符之后的最后一个段)。
在本教程中,我们将研究获取 URL 最后一段的不同方法。
1、使用URI类
java.net.URI类支持使用面向对象的方法来解析和操作 URI 。为了方便起见,我们举个例子:
@Test public void givenURL_whenUsingURIClass_thenGetLastPathSegment() throws URISyntaxException { URI uri = new URI("https://www.example.com/path/to/resource"); String path = uri.getPath(); String[] segments = path.split("/"); String lastSegment = segments[segments.length - 1]; assertEquals("resource", lastSegment); }
|
给定方法使用示例 URL初始化URI 。随后,使用getPath()方法提取 URI 的路径。然后根据正斜杠 (“/”) 分隔符将路径分成多个段。然后通过访问段数组的最后一个元素来确定最后一个路径段。最后,测试断言最后一个路径段与预期值匹配,从而确认该功能正确地从 URL 中提取了预期资源。
2. 使用路径类
在Java 7中,java.nio.file.Path类为文件和路径提供了与平台无关的表示。提供一种有效的方法来提取 URI 的最后一段。这是一个例子:
@Test public void givenURL_whenUsingPathClass_thenGetLastPathSegment() { String exampleURI = "https://www.example.com/path/to/resource"; try { URI uri = new URI(exampleURI); String pathString = uri.getPath(); Path path = Paths.get(pathString); Path lastSegment = path.getName(path.getNameCount() - 1); assertEquals("resource", lastSegment.toString()); } catch (Exception e) { fail("Exception occurred: " + e.getMessage()); } }
|
与上一节一样,我们首先初始化一个 URI 并使用getPath()方法。随后,我们从获得的pathString创建一个名为 path 的Path对象。最后一个段是使用getName()方法和索引计算来确定的。然后将最后一个路径段转换为字符串以进行比较。3.使用FilenameUtils类
Apache Commons IO库有一个FilenameUtils类,可用作常见文件和路径任务的实用程序类。让我们举个例子:
@Test public void givenURL_whenUsingFilenameUtilsClass_thenGetLastPathSegment() throws URISyntaxException { String exampleURI = "https://www.example.com/path/to/resource"; URI uri = new URI(exampleURI); String path = uri.getPath(); String lastSegment = FilenameUtils.getName(path); assertEquals("resource", lastSegment); }
|
使用getPath()方法提取路径后,我们利用FilenameUtils类使用getName()方法获取最后一个路径段,该方法将路径作为参数。4. 使用正则表达式
在从 URL 中提取最后一个路径段时,正则表达式为灵活且精确的模式定义提供了优雅的解决方案。这是一个例子:
@Test public void givenURL_whenUsingRegularExpression_thenGetLastPathSegment() throws URISyntaxException { URI uri = new URI("https://www.example.com/path/to/resource"); String path = uri.getPath(); Pattern pattern = Pattern.compile(".*/(.+)"); Matcher matcher = pattern.matcher(path); if (!matcher.find()) { fail("Regex pattern didn't match."); } String lastSegment = matcher.group(1); assertEquals("resource", lastSegment); }
|
在这里,我们定义了一个正则表达式模式“ /(.+) ”来精确捕获 URL 路径的最后一段。利用Pattern和Matcher类,我们使用compile()和matcher()方法编译正则表达式模式并将其应用到路径字符串。此外,条件检查进一步验证使用find()方法的正则表达式模式应用程序是否成功。成功匹配后,使用group(1)方法从Matcher对象中提取最后一个路径段。