欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

【译文】Commons Validator使用介绍
(last modified Jun 26, 2023, 2:04 PM )
by
侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 66 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

【译文】Commons Validator使用介绍

橙序员
2022-08-10 / 0 评论 / 0 点赞 / 1,067 阅读 / 3,980 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

1. 概述Commons Validator 有两个目的:提供标准、独立的验证例程/功能。为验证提供一个迷你框架。从 1.3.0 版开始创建了这个包,试图清楚地区分这两个问题,并且是Commons Validator中标准的、独立的验证例程/函数的位置。这个包的内容不依赖于 Commons Vali

1. 概述

Commons Validator 有两个目的:

  • 提供标准、独立的验证例程/功能。
  • 为验证提供一个迷你框架。

从 1.3.0 版开始创建了这个包,试图清楚地区分这两个问题,并且是Commons Validator中标准的、独立的验证例程/函数的位置。

这个包的内容不依赖于 Commons Validator 的框架方面,可以单独使用。

2. 日期和时间验证器

2.1 概述

日期和时间验证器要么根据指定 的格式进行验证,**要么对指定的Locale.

2.2 验证日期值

您可以使用其中一种isValid()方法来确定日期是否有效,或者使用其中一种validate()方法来验证日期并将其转换为java.util.Date

      // Get the Date validator
      DateValidator validator = DateValidator.getInstance();

      // Validate/Convert the date
      Date fooDate = validator.validate(fooString, "dd/MM/yyyy");
      if (fooDate == null) {
          // error...not a valid date
          return;
      }

提供以下方法来验证日期/时间(返回布尔结果):

  • isValid(*value*)
  • isValid(*value*, *pattern*)
  • isValid(*value*, Locale)
  • isValid(*value*, *pattern*, Locale)

提供了以下方法来验证日期/时间并将其转换为 a java.util.Datejava.util.Calendar

  • validate(*value*)
  • validate(*value*, *pattern*)
  • validate(*value*, Locale)
  • validate(*value*, *pattern*, Locale)

2.3 格式化

格式化和验证是同一枚硬币的两个方面。通常 ,根据指定格式从字符串转换的**输入值也必须以相同格式呈现以输出。这些验证器提供了将日期/时间对象格式化为字符串的机制。提供以下方法将日期/时间值格式化为字符串:

  • format(*date/calendar*)
  • format(*date/calendar*, *pattern*)
  • format(*date/calendar*, Locale)
  • format(*date/calendar*, *pattern*, Locale)

2.4 时区

如果要解析的日期与系统默认时区不同,您可以指定TimeZone验证/转换时使用的时区:

      // Get the GMT time zone
      TimeZone GMT = TimeZone.getInstance("GMT");

      // Validate/Convert the date using GMT
      Date fooDate = validator.validate(fooString, "dd/MM/yyyy", GMT);

提供了以下时区风格的验证/转换方法:

  • validate(*value*, TimeZone)
  • validate(*value*, *pattern*, TimeZone)
  • validate(*value*, Locale, TimeZone)
  • validate(*value*, *pattern*, Locale, TimeZone)

2.5 比较日期和时间

除了验证值是否为有效日期或时间外,这些验证器还提供日期比较功能。和提供比较年、季度、月、周和日期的功能,并DateValidator 提供比较小时、分钟、秒和毫秒的功能。例如,要检查日期是否在当前月份,您可以使用比较日期的年份和月份部分的方法: CalendarValidator``TimeValidator``compareMonths()

      // Check if the date is in the current month 
      int compare = validator.compareMonths(fooDate, new Date(), null); 
      if (compare == 0) { 
          // do current month processing
          return;
      }

      // Check if the date is in the previous quarter
      compare = validator.compareQuarters(fooDate, new Date(), null);
      if (compare < 0) {
          // do previous quarter processing
          return;
      }

      // Check if the date is in the next year
      compare = validator.compareYears(fooDate, new Date(), null);
      if (compare > 0) {
          // do next year processing
          return;
      }

3 个数字验证器

3.1 概述

数字验证器要么根据指定的格式进行验证,要么对指定 的使用标准格式,或者对指定的Locale使用自定义格式Locale

3.2 验证数值

您可以使用其中一种isValid()方法来确定数字是否有效,也可以使用其中一种validate()方法来验证数字并将其转换为适当的类型。

以下示例根据德语区域设置的自定义模式验证整数。请注意,格式是使用标准符号指定的,java.text.DecimalFormat因此尽管小数点分隔符在格式中以句点 (“.”) 表示,但验证器将使用德语小数点分隔符进行检查 - 这是一个逗号 (“,”)。

      // Get the Integer validator
      IntegerValidator validator = IntegerValidator.getInstance();

      // Validate/Convert the number
      Integer fooInteger = validator.validate(fooString, "#,##0.00", Locale.GERMAN);
      if (fooInteger == null) {
          // error...not a valid Integer
          return;
      }

提供了以下方法来验证数字(返回布尔结果):

  • isValid(*value*)
  • isValid(*value*, *pattern*)
  • isValid(*value*, Locale)
  • isValid(*value*, *pattern*, Locale)

提供了以下方法来验证数字并将其转换为java.lang.Number实现之一:

  • validate(*value*)
  • validate(*value*, *pattern*)
  • validate(*value*, Locale)
  • validate(*value*, *pattern*, Locale)

3.3 格式化

格式化和验证是同一枚硬币的两个方面。通常 ,根据指定格式从字符串转换的**输入值也必须以相同格式呈现以输出。这些验证器提供了将数字对象格式化为字符串的机制。提供以下方法将数值格式化为字符串:

  • format(*number*)
  • format(*number*, *pattern*)
  • format(*number*, Locale)
  • format(*number*, *pattern*, Locale)

3.4 比较数字

除了验证一个值是一个有效数字之外,这些验证器还提供了验证一个值的最小值最大值范围的功能。

      // Check the number is between 25 and 75
      if (validator.isInRange(fooInteger, 25, 75) {
          // valid...in the specified range
          return;
      }

3.5 货币验证

提供了默认的货币验证器 实现,尽管所有数字验证器都支持货币验证。默认实现将货币金额转换为 java.math.BigDecimal,此外它还提供宽松的货币符号验证。也就是说,无论有无货币符号,货币金额都有效

      BigDecimalValidator validator = CurrencyValidator.getInstance();

      BigDecimal fooAmount = validator.validate("$12,500.00", Locale.US);
      if (fooAmount == null) {
          // error...not a valid currency amount
          return;
      }

      // Check the amount is a minimum of $1,000
      if (validator.minValue(fooAmount, 1000) {
          // valid...in the specified range
          return;
      }

例如,如果您想使用整数验证器来验证货币,那么您可以简单地创建一个具有适当格式样式的新实例。请注意,其他验证器不支持宽松的货币符号验证。

      IntegerValidator validator = 
          new IntegerValidator(true, IntegerValidator.CURRENCY_FORMAT);

      String pattern = "#,###" + '\u00A4' + '\u00A4';  // Use international symbol

      Integer fooAmount = validator.validate("10.100EUR", pattern, Locale.GERMAN);
      if (fooAmount == null) {
          // error...not a valid currency amount
          return;
      }

3.6 百分比验证

提供了默认的百分比验证器 实现,尽管FloatDoubleBigDecimal验证器也支持百分比验证。默认实现将百分比金额转换为 a java.math.BigDecimal,此外它还提供宽松的百分比符号验证。也就是说,百分比金额在有没有百分比符号的情况下都是有效的。

      BigDecimalValidator validator = PercentValidator.getInstance();

      BigDecimal fooPercent = validator.validate("20%", Locale.US);
      if (fooPercent == null) {
          // error...not a valid percent
          return;
      }

      // Check the percent is between 10% and 90%
      if (validator.isInRange(fooPercent, 0.1, 0.9) {
          // valid...in the specified range
          return;
      }

例如,如果您想使用Float Validator来验证百分比,那么您可以简单地创建一个具有适当格式 style的新实例。请注意,其他验证器不支持宽松的百分比符号验证。

      FloatValidator validator = 
          new FloatValidator(true, FloatValidator.PERCENT_FORMAT);

      Float fooPercent = validator.validate("20%", "###%");
      if (fooPercent == null) {
          // error...not a valid percent
          return;
      }

注意:理论上,除了 FloatDoubleBigDecimal之外的其他数字验证器(即ByteShortIntegerLongBigInteger)也支持百分比验证。但是,由于它们不允许使用分数,因此它们仅适用于大于 100% 的百分比。

4. 其他验证者

4.1 概述

本节列出了其他可用的验证器。

4.2 正则表达式验证

正则表达式验证可以通过使用 RegexValidator 提供的静态方法 或通过创建一个新实例来完成,该实例缓存并重用已编译的模式。

下面是使用其中一种静态方法进行验证的示例,以不区分大小写的方式进行匹配并返回匹配组的字符串(不包括连字符)。

      // set up the parameters
      boolean caseSensitive   = false;
      String regex            = "^([A-Z]*)(?:\\-)([A-Z]*)$";

      // validate - result should be a String of value "abcdef"
      String result = RegexValidator.validate("abc-def", regex, caseSensitive);

为正则表达式验证提供了以下静态方法:

  • isValid(*value*, *regex*)
  • isValid(*value*, *regex*, *caseSensitive*)
  • validate(*value*, *regex*)
  • validate(*value*, *regex*, *caseSensitive*)
  • match(*value*, *regex*)
  • match(*value*, *regex*, *caseSensitive*)

下面是一个创建RegexValidator 实例的示例,该实例以 不区分大小写 的方式与一组正则表达式进行 匹配:

      // set up the parameters
      boolean caseSensitive = false;
      String regex1   = "^([A-Z]*)(?:\\-)([A-Z]*)*$"
      String regex2   = "^([A-Z]*)$";
      String[] regexs = new String[] {regex1, regex1};

      // Create the validator
      RegexValidator validator = new RegexValidator(regexs, caseSensitive);

      // Validate true/false
      boolean valid = validator.isValid("abc-def");

      // Validate and return a String
      String result = validator.validate("abc-def");

      // Validate and return a String[]
      String[] groups = validator.match("abc-def");

有关可用构造函数的完整列表,请参阅 RegexValidator javadoc。

4.3 校验位验证/计算

CheckDigit定义了一种新类型,用于计算和验证校验位,方法如下:

  • isValid(*code*)- 验证代码的校验位,返回truefalse
  • calculate(*code*)- 计算返回校验位字符的代码的校验位。

提供了以下实现:

以下示例显示验证代码的校验位:

      // Luhn check digit validation
      boolean valid = LuhnCheckDigit.INSTANCE.isValid(code);

      // EAN / UPC / ISBN-13 check digit validation
      boolean valid = EAN13CheckDigit.INSTANCE.isValid(code);

      // ISBN-10 check digit validation
      boolean valid = ISBNCheckDigit.ISBN10.isValid(code);
      boolean valid = ISBN10CheckDigit.INSTANCE.isValid(code);

      // ISBN-13 check digit validation
      boolean valid = ISBNCheckDigit.ISBN13.isValid(code);

      // ISBN-10 or ISBN-13 check digit validation
      boolean valid = ISBNCheckDigit.ISBN.isValid(code);

以下示例显示了如何计算代码的校验位:

      // Luhn check digit validation
      char checkdigit = LuhnCheckDigit.INSTANCE.calculate(code);

      // EAN / UPC / ISBN-13 check digit validation
      char checkdigit = EAN13CheckDigit.INSTANCE.calculate(code);

      // ISBN-10 check digit validation
      char checkdigit = ISBNCheckDigit.ISBN10.isValid(code);
      char checkdigit = ISBN10CheckDigit.INSTANCE.calculate(code);

      // ISBN-13 check digit validation
      char checkdigit = ISBNCheckDigit.ISBN13.calculate(code);

      // ISBN-10 or ISBN-13 check digit validation
      char checkdigit = ISBNCheckDigit.ISBN.calculate(code);

4.4 通用代码验证

CodeValidator提供了用于验证代码的通用实现。它对代码执行以下验证:

  • 格式- 使用正则表达式验证代码的格式(请参阅 RegexValidator)。
  • 长度- 检查代码的最小/最大长度 - 在被正则表达式解析之后 - 使用非捕获组可以删除 格式字符。
  • Check Digit - CheckDigit 例程检查代码的校验位是否有效。

例如创建一个验证器来验证 EAN-13 代码(数字,长度为 13):

      // Create an EAN-13 code validator
      CodeValidator validator = new CodeValidator("^[0-9]*$", 13, EAN13CheckDigit.INSTANCE);

      // Validate an EAN-13 code
      if (!validator.isValid(code)) {
          ... // invalid
      }

4.5 ISBN 验证

ISBNValidator提供 ISBN-10 和 ISBN-13 验证,并且可以选择将 ISBN-10 代码转换为 ISBN-13。

  • ISBN-10 - 使用 带有 ISBN10CheckDigit 例程的CodeValidator进行验证。
    • isValidISBN10(*value*)- 返回一个布尔值
    • validateISBN10(*value*)- 返回重新格式化的 ISBN-10 代码
  • ISBN-13 - 使用 带有 EAN13CheckDigit 例程的CodeValidator进行验证。
    • isValidISBN13(*value*)- 返回一个布尔值
    • validateISBN13(*value*)- 返回重新格式化的 ISBN-13 代码
  • ISBN-10ISBN-13 - 验证代码是有效的 ISBN-10 还是有效的 ISBN-13 - 可以选择将 ISBN-10 代码转换为 ISBN-13。
    • isValid(*value*)- 返回一个布尔值
    • validate(*value*)- 返回重新格式化的 ISBN 代码(如果转换选项为,则将 ISBN-10 转换为 ISBN-13 true)。

例如验证

      // Validate an ISBN-10 or ISBN-13 code
      if (!ISBNValidator.getInstance().isValid(code)) {
          ... // invalid
      }

      // Validate an ISBN-10 or ISBN-13 code (converting to ISBN-13)
      String code = ISBNValidator.getInstance().validate(code);

      // Validate an ISBN-10 or ISBN-13 code (not converting)
      String code = ISBNValidator.getInstance(false).validate(code);

4.6 IP 地址验证

InetAddressValidator提供 IPv4 地址验证。

例如:

      // Get an InetAddressValidator
      InetAddressValidator validator = InetAddressValidator.getInstance();

      // Validate an IPv4 address
      if (!validator.isValid(candidateInetAddress)) {
          ... // invalid
      }

4.7 电子邮件地址验证

EmailValidator根据 RFC 822 标准提供电子邮件地址验证。

例如:

      // Get an EmailValidator
      EmailValidator validator = EmailValidator.getInstance();

      // Validate an email address
      boolean isAddressValid = validator.isValid("user@apache.org");

      // Validate a variable containing an email address
      if (!validator.isValid(addressFromUserForm)) {
          webController.sendRedirect(ERROR_REDIRECT, "Email address isn't valid");
          // etc.
      }

4.8 网址验证

UrlValidator通过依次检查方案、权限、路径、查询和片段来提供 URL 验证。除了或代替默认值(HTTP、HTTPS、FTP),客户端可以指定用于验证的有效方案。UrlValidator 还支持更改解析规则的选项;例如,ALLOW_2_SLASHES 选项指示验证器允许路径组件中出现连续的斜线字符,默认情况下这被认为是错误的。有关可用选项的更多信息,请参阅 UrlValidator 文档。

例如:

      // 获取一个 UrlValidator
      UrlValidator defaultValidator = new UrlValidator(); // 默认方案
      if (defaultValidator.isValid("http://www.apache.org")) {
          ... // 有效的
      }
      if (!defaultValidator.isValid("http//www.oops.com")) {
          ... // 无效的
      }

      // 使用自定义方案获取 UrlValidator
      String[] customSchemes = { "sftp", "scp", "https" };
      UrlValidator customValidator = new UrlValidator(customSchemes);
      if (!customValidator.isValid("http://www.apache.org")) {
          ... // 由于不安全的协议而无效
      }

      // 获取一个允许路径中有双斜杠的 UrlValidator
      UrlValidator doubleSlashValidator = new UrlValidator(UrlValidator.ALLOW_2_SLASHES);
      if (doubleSlashValidator.isValid("http://www.apache.org//projects")) {
          ... // 仅在此 Validator 实例中有效
      }

4.9 域名验证

DomainValidator根据 RFC1034/RFC1123 的规定以及 IANA 认可的顶级域 (TLD) 列表对 Internet 域名进行验证。客户可以验证整个域名、任何类别的 TLD 或特定类别中的 TLD。

例如:

      // Get a DomainValidator
      DomainValidator validator = DomainValidator.getInstance();

      // Validate a domain name
      if (validator.isValid("www.apache.org")) {
          ... // valid
      }
      if (!validator.isValid("www.apache.wrong")) {
          ... // invalid
      }

      // Validate a TLD
      if (validator.isValidTld(".com")) {
          ... // valid
      }
      if (validator.isValidTld("org")) {
          ... // valid, the leading dot is optional
      }
      if (validator.isValidTld(".us")) {
          ... // valid, country code TLDs are also accepted
      }

      // Validate TLDs in categories
      if (validator.isValidGenericTld(".name")) {
          ... // valid
      }
      if (!validator.isValidGenericTld(".uk")) {
          ... // invalid, .uk is a country code TLD
      }
      if (!validator.isValidCountryCodeTld(".info")) {
          ... // invalid, .info is a generic TLD
      }
0

评论区