如何在 Java 中检查字符串是否符合 URL 格式

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用正则表达式在 Java 中检查给定的字符串是否符合 URL 格式。我们将定义一个专门用于 URL 的正则表达式模式,使用 Pattern.matches() 方法根据此模式测试字符串,并探讨如何验证常见的 URL 方案。这个实践练习将指导你完成在 Java 应用程序中实现 URL 验证的实际步骤。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/StringManipulationGroup -.-> java/regex("RegEx") subgraph Lab Skills java/regex -.-> lab-559993{{"如何在 Java 中检查字符串是否符合 URL 格式"}} end

定义 URL 正则表达式模式

在这一步中,你将学习如何在 Java 中定义一个正则表达式模式来匹配 URL。正则表达式,通常简称为“regex”或“regexp”,是用于定义搜索模式的字符序列。它们在字符串的模式匹配和操作方面非常强大。

对于验证 URL,正则表达式模式可以帮助我们检查给定的字符串是否遵循 URL 的标准结构(例如 http://www.example.comhttps://example.org/path)。

让我们创建一个新的 Java 文件来处理正则表达式。

  1. 打开 WebIDE。在左侧的文件资源管理器中,确保你位于 ~/project 目录下。

  2. ~/project 目录的空白处右键单击,然后选择“新建文件”。

  3. 将新文件命名为 UrlValidator.java,然后按回车键。

  4. UrlValidator.java 文件应该会在代码编辑器中打开。

  5. 将以下 Java 代码复制并粘贴到编辑器中:

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL
            String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            System.out.println("URL Regex Pattern Defined.");
        }
    }

    让我们来分析一下这段代码的新部分:

    • import java.util.regex.Pattern;:这行代码导入了 Pattern 类,它是 Java 内置的正则表达式支持的一部分。
    • String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";:这行代码定义了一个名为 urlRegexString 变量,并为其赋值我们的正则表达式模式。
      • ^:匹配字符串的开头。
      • (http|https):匹配“http”或“https”。
      • ://:匹配字面字符“://”。
      • [^\\s/$.?#]:匹配任何不是空白字符 (\\s)、斜杠 (/)、美元符号 ($)、句点 (.)、问号 (?) 或井号 (#) 的字符。这是一种简化的匹配域名部分的方法。
      • .:匹配任何字符(换行符除外)。
      • [^\\s]*:匹配零个或多个非空白字符。这是一种简化的匹配 URL 路径和查询的其余部分的方法。
      • $:匹配字符串的结尾。
      • 注意 s 前面的双反斜杠 (\\)。在 Java 字符串中,单个反斜杠是转义字符,因此我们需要使用 \\ 来表示正则表达式模式中的字面反斜杠。
    • Pattern pattern = Pattern.compile(urlRegex);:这行代码将正则表达式字符串编译成一个 Pattern 对象。如果你打算多次使用相同的模式,编译模式会更高效。
    • System.out.println("URL Regex Pattern Defined.");:这行代码只是在控制台打印一条消息,表明模式已定义。
  6. 保存文件(Ctrl+S 或 Cmd+S)。

  7. 现在,让我们编译这个 Java 程序。打开 WebIDE 底部的终端。确保你位于 ~/project 目录下。

  8. 使用 javac 命令编译代码:

    javac UrlValidator.java

    如果没有错误,命令将在没有输出的情况下完成。~/project 目录中会创建一个 UrlValidator.class 文件。

  9. 使用 java 命令运行编译后的程序:

    java UrlValidator

    你应该会看到以下输出:

    URL Regex Pattern Defined.

你已经成功定义并编译了一个包含基本 URL 正则表达式模式的 Java 程序。在下一步中,我们将使用这个模式来测试不同的字符串是否为有效的 URL。

使用 Pattern.matches() 测试 URL

在上一步中,我们定义了一个用于 URL 的正则表达式模式,并将其编译成了一个 Pattern 对象。现在,让我们使用这个模式,通过 Pattern.matches() 方法来检查不同的字符串是否为有效的 URL。

Pattern.matches(regex, input) 方法是一种便捷的方式,用于检查整个输入字符串是否与给定的正则表达式匹配。它会在一个步骤中编译正则表达式并将输入与之进行匹配。

让我们修改 UrlValidator.java 文件,以测试一些示例 URL。

  1. 如果 UrlValidator.java 文件尚未在 WebIDE 编辑器中打开,请打开它。

  2. 修改 main 方法,加入以下代码。你需要在 Pattern pattern = Pattern.compile(urlRegex); 这一行之后添加此代码。

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL
            String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            // Test some URLs
            String url1 = "http://www.example.com";
            String url2 = "https://example.org/path/to/page";
            String url3 = "ftp://invalid-url.com"; // Invalid scheme
            String url4 = "http:// example.com"; // Invalid character (space)
    
            System.out.println("\nTesting URLs:");
    
            boolean isUrl1Valid = Pattern.matches(urlRegex, url1);
            System.out.println(url1 + " is valid: " + isUrl1Valid);
    
            boolean isUrl2Valid = Pattern.matches(urlRegex, url2);
            System.out.println(url2 + " is valid: " + isUrl2Valid);
    
            boolean isUrl3Valid = Pattern.matches(urlRegex, url3);
            System.out.println(url3 + " is valid: " + isUrl3Valid);
    
            boolean isUrl4Valid = Pattern.matches(urlRegex, url4);
            System.out.println(url4 + " is valid: " + isUrl4Valid);
        }
    }

    以下是我们添加的内容:

    • 我们定义了四个 String 变量 (url1url2url3url4),包含不同的示例字符串,其中一些是符合我们简单模式的有效 URL,而另一些则是无效的。
    • 我们添加了一条打印语句,以使输出更清晰。
    • 我们对每个测试字符串使用了 Pattern.matches(urlRegex, url) 方法。如果整个字符串与 urlRegex 模式匹配,该方法返回 true,否则返回 false
    • 我们打印了每个 URL 的验证结果。
  3. 保存 UrlValidator.java 文件。

  4. 在终端中编译修改后的代码:

    javac UrlValidator.java

    同样,如果编译成功,将不会有输出。

  5. 运行编译后的程序:

    java UrlValidator

    你应该会看到类似于以下的输出:

    URL Regex Pattern Defined.
    
    Testing URLs:
    http://www.example.com is valid: true
    https://example.org/path/to/page is valid: true
    ftp://invalid-url.com is valid: false
    http:// example.com is valid: false

这个输出表明,我们的简单正则表达式模式正确地将前两个字符串识别为有效 URL(根据该模式),将后两个识别为无效 URL。

你现在已经成功地在 Java 中使用 Pattern.matches() 方法,根据正则表达式模式测试字符串了。

验证常见的 URL 协议

在前面的步骤中,我们定义了一个简单的正则表达式模式,并使用 Pattern.matches() 方法对其进行了测试。目前我们的模式仅能验证以 httphttps 开头的 URL。然而,URL 还可以使用其他协议,如 ftpmailtofile 等。

在这一步中,我们将修改正则表达式模式,以包含更多常见的 URL 协议。一个更强大的 URL 正则表达式模式相当复杂,但为了演示目的,我们可以扩展当前的模式,使其包含更多常见的协议。

让我们更新 UrlValidator.java 文件。

  1. 在 WebIDE 编辑器中打开 UrlValidator.java 文件。

  2. 修改 urlRegex 字符串,除了 httphttps 之外,还包含 ftpmailto 协议。我们还将添加一个针对 ftp URL 的测试用例。

    将以下代码行:

    String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";

    替换为:

    String urlRegex = "^(http|https|ftp|mailto)://[^\\s/$.?#].[^\\s]*$";

    注意,我们只是在表示分组的括号 () 内添加了 |ftp|mailto| 符号充当“或”运算符。这意味着该模式现在将匹配以 httphttpsftpmailto 开头,后跟 :// 的字符串。

  3. 为 FTP URL 添加一个新的测试用例。在 url4 的定义之后添加以下代码行:

    String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL
  4. 在对 url4 进行验证之后,添加对 url5 的验证:

    boolean isUrl5Valid = Pattern.matches(urlRegex, url5);
    System.out.println(url5 + " is valid: " + isUrl5Valid);

    现在,你完整的 main 方法应该如下所示:

    import java.util.regex.Pattern;
    
    public class UrlValidator {
    
        public static void main(String[] args) {
            // Define a simple regex pattern for a URL including more schemes
            String urlRegex = "^(http|https|ftp|mailto)://[^\\s/$.?#].[^\\s]*$";
    
            // Compile the regex pattern
            Pattern pattern = Pattern.compile(urlRegex);
    
            System.out.println("URL Regex Pattern Defined.");
    
            // Test some URLs
            String url1 = "http://www.example.com";
            String url2 = "https://example.org/path/to/page";
            String url3 = "invalid-url.com"; // Invalid (missing scheme)
            String url4 = "http:// example.com"; // Invalid character (space)
            String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL
    
            System.out.println("\nTesting URLs:");
    
            boolean isUrl1Valid = Pattern.matches(urlRegex, url1);
            System.out.println(url1 + " is valid: " + isUrl1Valid);
    
            boolean isUrl2Valid = Pattern.matches(urlRegex, url2);
            System.out.println(url2 + " is valid: " + isUrl2Valid);
    
            boolean isUrl3Valid = Pattern.matches(urlRegex, url3);
            System.out.println(url3 + " is valid: " + isUrl3Valid);
    
            boolean isUrl4Valid = Pattern.matches(urlRegex, url4);
            System.out.println(url4 + " is valid: " + isUrl4Valid);
    
            boolean isUrl5Valid = Pattern.matches(urlRegex, url5);
            System.out.println(url5 + " is valid: " + isUrl5Valid);
        }
    }
  5. 保存 UrlValidator.java 文件。

  6. 在终端中编译更新后的代码:

    javac UrlValidator.java
  7. 运行编译后的程序:

    java UrlValidator

    现在你应该会看到类似以下的输出,其中 FTP URL 也被标记为有效:

    URL Regex Pattern Defined.
    
    Testing URLs:
    http://www.example.com is valid: true
    https://example.org/path/to/page is valid: true
    invalid-url.com is valid: false
    http:// example.com is valid: false
    ftp://ftp.example.com/files is valid: true

你已经成功修改了正则表达式模式,使其包含更多常见的 URL 协议,并对更新后的模式进行了测试。这展示了你如何调整正则表达式模式以匹配更广泛的输入。

总结

在这个实验中,我们首先学习了如何在 Java 中定义一个专门用于验证 URL 的正则表达式模式。我们创建了一个新的 Java 文件 UrlValidator.java,并导入了 java.util.regex.Pattern 类。然后,我们定义了一个 String 变量 urlRegex,其中包含一个基本的正则表达式模式,该模式用于匹配以 "http" 或 "https" 开头,后跟 "://" 的字符串,并使用 Pattern.compile() 方法编译了这个模式。这第一步着重于搭建必要的工具,并利用 Java 内置的正则表达式功能定义了用于 URL 验证的核心模式。