介绍
在这个实验中,你将学习如何使用正则表达式在 Java 中检查给定的字符串是否符合 URL 格式。我们将定义一个专门用于 URL 的正则表达式模式,使用 Pattern.matches() 方法根据此模式测试字符串,并探讨如何验证常见的 URL 方案。这个实践练习将指导你完成在 Java 应用程序中实现 URL 验证的实际步骤。
定义 URL 正则表达式模式
在这一步中,你将学习如何在 Java 中定义一个正则表达式模式来匹配 URL。正则表达式,通常简称为“regex”或“regexp”,是用于定义搜索模式的字符序列。它们在字符串的模式匹配和操作方面非常强大。
对于验证 URL,正则表达式模式可以帮助我们检查给定的字符串是否遵循 URL 的标准结构(例如 http://www.example.com 或 https://example.org/path)。
让我们创建一个新的 Java 文件来处理正则表达式。
打开 WebIDE。在左侧的文件资源管理器中,确保你位于
~/project目录下。在
~/project目录的空白处右键单击,然后选择“新建文件”。将新文件命名为
UrlValidator.java,然后按回车键。UrlValidator.java文件应该会在代码编辑器中打开。将以下 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]*$";:这行代码定义了一个名为urlRegex的String变量,并为其赋值我们的正则表达式模式。^:匹配字符串的开头。(http|https):匹配“http”或“https”。://:匹配字面字符“://”。[^\\s/$.?#]:匹配任何不是空白字符 (\\s)、斜杠 (/)、美元符号 ($)、句点 (.)、问号 (?) 或井号 (#) 的字符。这是一种简化的匹配域名部分的方法。.:匹配任何字符(换行符除外)。[^\\s]*:匹配零个或多个非空白字符。这是一种简化的匹配 URL 路径和查询的其余部分的方法。$:匹配字符串的结尾。- 注意
s前面的双反斜杠 (\\)。在 Java 字符串中,单个反斜杠是转义字符,因此我们需要使用\\来表示正则表达式模式中的字面反斜杠。
Pattern pattern = Pattern.compile(urlRegex);:这行代码将正则表达式字符串编译成一个Pattern对象。如果你打算多次使用相同的模式,编译模式会更高效。System.out.println("URL Regex Pattern Defined.");:这行代码只是在控制台打印一条消息,表明模式已定义。
保存文件(Ctrl+S 或 Cmd+S)。
现在,让我们编译这个 Java 程序。打开 WebIDE 底部的终端。确保你位于
~/project目录下。使用
javac命令编译代码:javac UrlValidator.java如果没有错误,命令将在没有输出的情况下完成。
~/project目录中会创建一个UrlValidator.class文件。使用
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。
如果
UrlValidator.java文件尚未在 WebIDE 编辑器中打开,请打开它。修改
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变量 (url1、url2、url3、url4),包含不同的示例字符串,其中一些是符合我们简单模式的有效 URL,而另一些则是无效的。 - 我们添加了一条打印语句,以使输出更清晰。
- 我们对每个测试字符串使用了
Pattern.matches(urlRegex, url)方法。如果整个字符串与urlRegex模式匹配,该方法返回true,否则返回false。 - 我们打印了每个 URL 的验证结果。
- 我们定义了四个
保存
UrlValidator.java文件。在终端中编译修改后的代码:
javac UrlValidator.java同样,如果编译成功,将不会有输出。
运行编译后的程序:
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() 方法对其进行了测试。目前我们的模式仅能验证以 http 或 https 开头的 URL。然而,URL 还可以使用其他协议,如 ftp、mailto、file 等。
在这一步中,我们将修改正则表达式模式,以包含更多常见的 URL 协议。一个更强大的 URL 正则表达式模式相当复杂,但为了演示目的,我们可以扩展当前的模式,使其包含更多常见的协议。
让我们更新 UrlValidator.java 文件。
在 WebIDE 编辑器中打开
UrlValidator.java文件。修改
urlRegex字符串,除了http和https之外,还包含ftp和mailto协议。我们还将添加一个针对ftpURL 的测试用例。将以下代码行:
String urlRegex = "^(http|https)://[^\\s/$.?#].[^\\s]*$";替换为:
String urlRegex = "^(http|https|ftp|mailto)://[^\\s/$.?#].[^\\s]*$";注意,我们只是在表示分组的括号
()内添加了|ftp|mailto,|符号充当“或”运算符。这意味着该模式现在将匹配以http、https、ftp或mailto开头,后跟://的字符串。为 FTP URL 添加一个新的测试用例。在
url4的定义之后添加以下代码行:String url5 = "ftp://ftp.example.com/files"; // Valid FTP URL在对
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); } }保存
UrlValidator.java文件。在终端中编译更新后的代码:
javac UrlValidator.java运行编译后的程序:
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 验证的核心模式。



