文章摘要(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
.
- 日期验证器- 验证转换为
java.util.Date
类型的日期。 - 日历验证器- 验证转换为
java.util.Calendar
类型的日期。 - 时间验证器- 验证转换为
java.util.Calendar
类型的时间。
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.Date
或java.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
。
- 字节验证器- 验证转换为
java.lang.Byte
类型的数字。 - Short Validator - 验证转换为
java.lang.Short
类型的数字。 - 整数验证器- 验证转换为
java.lang.Integer
类型的数字。 - 长验证器- 验证转换为
java.lang.Long
类型的数字。 - Float Validator - 验证转换为
java.lang.Float
类型的数字。 - Double Validator - 验证转换为
java.lang.Double
类型的数字。 - BigInteger Validator - 验证转换为
java.math.BigInteger
类型的数字。 - BigDecimal Validator - 验证转换为
java.math.BigDecimal
类型的数字。
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 百分比验证
提供了默认的百分比验证器 实现,尽管Float、 Double和BigDecimal验证器也支持百分比验证。默认实现将百分比金额转换为 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;
}
注意:理论上,除了 Float、Double和BigDecimal之外的其他数字验证器(即Byte、 Short、Integer、Long和BigInteger)也支持百分比验证。但是,由于它们不允许使用分数,因此它们仅适用于大于 100% 的百分比。
4. 其他验证者
4.1 概述
本节列出了其他可用的验证器。
- 正则表达式- 使用 Java 1.4+ 正则表达式支持进行验证
- 校验位- 验证/计算校验位(即 EAN/UPC、信用卡、ISBN)。
- 代码验证- 提供通用代码验证 - 格式、最小/最大长度和校验位。
- ISBN 验证- 提供 ISBN-10 和 ISBN-13 验证。
- IP 地址验证- 提供 IPv4 地址验证。
- 电子邮件地址验证- 根据 RFC 822 标准提供电子邮件地址验证。
- URL 验证- 提供方案、域和权限的 URL 验证。
- 域名验证- 提供域名和 IANA TLD 验证。
4.2 正则表达式验证
正则表达式验证可以通过使用 RegexValidator 提供的静态方法 或通过创建一个新实例来完成,该实例缓存并重用已编译的模式。
- Method Flavors - 提供了三种验证方法:
-
isValid()
方法返回 true/false 以指示验证是否成功。validate()
方法返回聚合在一起String
的匹配组null
的值,或者如果无效。match()
方法返回String
匹配组的数组,或者null
如果无效。
- 区分大小写- 可以以区分大小写或不区分大小写的方式进行匹配。
- 多个表达式- 可以创建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*)
- 验证代码的校验位,返回true
或false
。calculate(*code*)
- 计算返回校验位字符的代码的校验位。
提供了以下实现:
- ABANumberCheckDigit 用于ABA 编号(或路由中转编号(RTN))校验位计算。
- CUSIPCheckDigit 用于CUSIP(北美证券)校验位计算。
- EAN13CheckDigit 用于EAN-13、UPC、ISBN-13校验位计算。
- ISBNCheckDigit 用于ISBN-10和ISBN-13校验位计算。
- ISBN10CheckDigit 用于ISBN-10校验位计算。
- ISINCheckDigit 用于ISIN国际证券识别号校验位计算。
- LuhnCheckDigit 用于Luhn校验位计算 - 由信用卡使用。
- ModulusCheckDigit -用于自定义模数校验位实现的抽象类。
- SedolCheckDigit 用于SEDOL(英国证券)校验位计算。
- VerhoeffCheckDigit 用于Verhoeff(二面体)校验位计算。
以下示例显示验证代码的校验位:
// 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-10和ISBN-13 - 验证代码是有效的 ISBN-10 还是有效的 ISBN-13 - 可以选择将 ISBN-10 代码转换为 ISBN-13。
-
isValid(*value*)
- 返回一个布尔值validate(*value*)
- 返回重新格式化的 ISBN 代码(如果转换选项为,则将 ISBN-10 转换为 ISBN-13true
)。
例如验证
// 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
}
评论区