如何使用正则表达式在 C++ 中验证图像文件扩展名

2024 年 8 月 29 日 | 阅读 6 分钟

在本例中,我们将通过几个例子讨论如何在 C++ 中使用正则表达式验证文件扩展名。

引言

图像文件验证 在许多应用程序中是一项非常重要的任务,尤其是在处理用户上传或外部数据源时。验证图像文件扩展名可确保只接受允许的图像类型,从而降低安全漏洞的风险并确保数据完整性。正则表达式提供了一种高级方法来定义模式,从而促进编程级别的图像文件扩展名验证。

问题陈述

在 C++ 程序中处理文件时,开发团队通常需要在接受图像进行处理或存储时检查提供的文件扩展名是否有效。当扩展支持的格式列表时,这可能会变得耗时且容易出错。此外,如果团队遵循允许文件基本名称和扩展名组合的命名约定,使用正则表达式是定义多种文件扩展名样式规则的更有效方法,例如 jpg 或 jpeg,然后根据这些规则验证文件名。

什么是正则表达式?

字符串中的字符组合可以使用正则表达式进行匹配。C++ 中的正则表达式模板库包含一些用于正则表达式的函数。以下是使用 C++ 中的正则表达式检查图像文件扩展名的分步说明。

  • 定义有效的图像文件扩展名:这是第一步。说明我们的应用程序支持哪些类型的图像具有有效扩展名(.jpg、.png、.gif、.bmp 等)。
  • 创建一个正则表达式模式,该模式将匹配任何有效的图像文件扩展名。该模式应使用'|'运算符指定多个扩展名,并转义特殊字符,如'.'
  • 编译正则表达式:使用 C++ 的 <regex> 头文件中的std::regex创建正则表达式模式。
  • 验证文件扩展名:如果传递了文件名,请使用std::regex_match检查文件扩展名是否与编译的正则表达式模式匹配。
  • 处理验证结果:根据验证结果,相应地处理文件,接受或拒绝它。

程序 1

让我们看一个例子,演示如何在 C++ 中使用正则表达式验证图像文件扩展名。

输出

Valid image file extension.

说明

  1. 在此示例中,我们定义了一个名为validateImageFileExtension的函数,该函数接受fileName作为输入,并返回一个boolean值,指示文件扩展名是否有效。
  2. 之后,我们构建一个正则表达式模式validExtensions,该模式匹配常见的图像文件扩展名。
  3. 接下来,使用std::regex编译正则表达式。
  4. 下面的函数将在 main 函数中测试示例文件名"example.jpg"的验证函数。
  5. 根据验证结果,它会显示“这是一个有效的图像文件扩展名”或“这是一个无效的图像文件扩展名”。

程序 2

让我们看另一个例子,演示如何在 C++ 中使用正则表达式验证图像文件扩展名。

输出

Test Case 1: 1
Test Case 2: 1
Test Case 3: 0
Test Case 4: 0
Test Case 5: 1

说明

1. 头文件包含

程序包含以下头文件

  • <iostream> 用于输入输出操作。
  • <regex> 用于正则表达式支持。

2. 命名空间声明

  • using namespace std; 语句允许使用标准 C++ 库函数和对象,而无需在前面加上std::前缀。

3. 函数定义 (validateImageExtension)

  • 此函数接受一个字符串(fileName)作为输入,并返回一个布尔值,指示文件扩展名是否有效。
  • 它使用正则表达式模式来定义有效的图像文件扩展名,例如 jpg、jpeg、png、gif、JPG、JPEG、PNG 和 GIF。
  • 该函数检查提供的文件名是否为空。如果是,则返回 false。
  • 之后,它使用regex_match将文件名与正则表达式模式进行匹配。如果匹配成功,则返回 true;否则返回 false。

4. 主函数

  • main 函数是程序的入口点。
  • 它包含多个测试用例,以演示validateImageExtension的用法。
  • 每个测试用例都涉及将文件名提供给validateImageExtension函数,并将结果(true 或 false)打印到控制台。

5. 测试用例

测试用例包括具有不同扩展名的各种文件名。

  • 测试用例 1:具有 .png 扩展名的有效图像文件名。
  • 测试用例 2:具有 .jpg 扩展名的有效图像文件名。
  • 测试用例 3:具有 .gif 扩展名的有效图像文件名。
  • 测试用例 4:具有 .mp3 扩展名的无效图像文件名。
  • 测试用例 5:在前面有一个空格的 .jpg 扩展名的无效图像文件名。

6. 输出

  • 程序将每个测试数据的输出写入控制台。如果有效,则打印结果 1;否则打印 0。

用途

图像文件扩展名有多种用途。一些主要用途如下:

  1. 数据完整性:确保未修改或删除未经授权的数据,并且系统输入或接收的数据符合某些标准或规则的检查是验证的示例。
  2. 安全性:当我们正确地清理输入以防止恶意代码或意外字符时,输入验证可以最小化安全威胁,例如注入攻击(例如,SQL 注入或跨站点脚本 (XSS) 攻击)。
  3. 用户体验:验证通过向我们提供有关输入错误的实时反馈来改善用户体验;如果我们对网页的客户端(是的,网页表单!)进行数据验证,我们将获得即时反馈,避免过度沮丧。因此,用户错误率较低。
  4. 合规性:某些行业中的标准和法规要求数据验证规则以确保合规性。例如,金融机构验证客户信息以符合 AML(AML 指“反洗钱”)规定。
  5. 验证:数据准确性是数据验证的基础之一。它确保数据是安全可靠的,可以用于自动化和分析。换句话说,组织可以通过根据预定义的标准或业务规则验证数据来确信其数据驱动的决策的准确性。
  6. 错误预防:通过强制执行输入规则和约束,验证可以减少用户输入的数据错误。当我们输入电子邮件地址时,我们可能已经注意到它们被验证了,这确保用户输入了正确格式的地址,并降低了这些地址从邮件列表中排除的可能性。
  7. 系统可靠性:在处理输入数据之前对其进行验证,可以防止由于输入意外或错误的数据而导致计算机系统崩溃或挂起。如果可以在流程早期捕获错误,则系统的结果/输出将更加可靠。
  8. 质量保证:在质量保证过程中,确保软件在给定的一组可能的条件和输入下按预期运行至关重要。可以运行自动化测试来证明某些类型的数据和功能是正确的。验证可以在最终用户遇到它们之前捕获错误和其他问题。

结论

总之,我们可以使用正则表达式来验证 C++ 中图像的文件扩展名,从而降低文件扩展名检查的复杂性(程序员只需比较一个值,而不是两个值),并使应用程序更加健壮。正则表达式可以非常灵活有效地用于定义模式和搜索模式匹配。因此,模式是正则表达式中的关键概念。