多个 @Pattern 的行为类似于 OR 操作

Posted

技术标签:

【中文标题】多个 @Pattern 的行为类似于 OR 操作【英文标题】:Multiple @Pattern behaving like OR operation 【发布时间】:2016-10-07 19:10:09 【问题描述】:

来自Multiple Regex @Pattern's for 1 Field?,我了解了如何添加多个模式,但这些模式充当 AND 操作。

有什么方法可以应用 OR 类型吗?

我想检查一个 URL 模式,从这个意义上说有两种可能性: - 基于域 - 基于IP地址

两者相似但不同,所以我想包括两种模式。

【问题讨论】:

【参考方案1】:

按照您提供的链接上的示例帖子,您可以利用正则表达式 OR,因此不要像 AND 这样使用多个模式:

@Pattern.List(
    @Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit."),
    @Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter.")
)
private String password;

您可以将其更改为使用单一模式,正则表达式交替用作 OR:

@Pattern(regexp = "(?=.*[0-9])|(?=.*[a-z])", message = "Password is invalid")
private String password;

由于我没有项目,因此无法测试此代码,但我只使用适用于所有正则表达式引擎的交替模式。

【讨论】:

我也考虑过你的方法,但由于正则表达式很长,我正在寻找更“干净”的东西。无论如何,谢谢。 @jlanza 好吧,这是一个与如何缩短正则表达式有关的不同问题。如果此问题中发布的答案解决了您的问题,那么您应该将您的问题标记为已解决并打开一个新问题。与缩短您的正则表达式有关,那么您可以使用这个(?=.*([0-9]|[a-z])) 感谢您的回复。该问题通常与正则表达式 OR 相关,并且您回答正确。我的评论只是说这已经在我的计划中,但我正在寻找一个 Pattern.List 但其中包含 OR,因此我可以获得不同的消息等。【参考方案2】:

一种解决方案是编写一个组合约束,例如MyURLPattern,它在内部使用“Boolean composition of constraints”的Hibernate 特定功能。在这种情况下,您还需要将 @ConstraintComposition(OR) 注释添加到您的组合约束中。

需要注意的是,此解决方案不能在 Bean 验证提供者之间移植。

【讨论】:

以上是关于多个 @Pattern 的行为类似于 OR 操作的主要内容,如果未能解决你的问题,请参考以下文章

我想在 iPad 应用程序中创建一个行为类似于操作表的自定义视图

UE4 C++命令模式 Command Pattern

RxJs操作符,其行为类似于withLatestFrom,但会等待第二个流的值。

如何创建一个行为类似于 UIKeyboard(数字键盘)的 UIButton 矩阵?

设计模式之十五:訪问者模式(Visitor Pattern)

如何创建一组行为类似于 RadioButtons 的 ToggleButtons?