当前位置: 首页 > 知识库问答 >
问题:

雅加达验证@Pattern regex

凤伟泽
2023-03-14

我有一个带有字段begDate的类需要验证:

@Data
@Entity
public class Booking
{
    @Id
    @GeneratedValue
    @Type(type = "uuid-char")
    private UUID   uuid;

    // there are many more fields and nothing more, the most of them aren't to validate and don't have annotations
    
    @NotEmpty
    @Pattern(regexp = "^(0$|[^0]\\d{0,19}$)", flags = Pattern.Flag.MULTILINE)
    @Length(min = 1, max = 20)
    private String begDate;

}

其思想是匹配任何一行,只由一个零组成,或由0或更多不以零开头的数字组成。我在这里测试了这个表达式,正如你所看到的,它是有效的——以零开头的行不匹配。

然而

validator.validateProperty(obj, "begDate")

在对象上,包含等于“09980514122516231246”(链接示例中的最低行)的begDate

@Pattern(regexp = "^(0$|[^0]\d{0,19}$)", flags = Pattern.Flag.MULTILINE)
@Length(min = 1, max = 20)
private String begDate;

不会返回任何错误。尽管如此,更简单的表达式仍能像预期的那样工作——验证以下属性

@NotEmpty
@Pattern(regexp = "[0-9]{13} {4}")
@Length(min = 17, max = 17)
private String ordeNr;

设置为“SDF55550”将返回一组constraintgViolations,由一个元素组成(如预期)。

我有点困惑,因为regex101。com理解我的正则表达式(我也尝试了所有的口味)。@Pattern中的正则表达式是否有任何限制,或者雅加达是否使用某些特定方言?

UPD:应该验证的字符串:

19980514122516231246

19990514122516231246

19980524561516231246

0

还有琴弦,那不应该:

09980514122516231246

00980514122516231246

00

现在上面的所有行都被成功验证了。重要提示:我总是只得到一行字符串,没有任何回车,每个新值的getDate在新的迭代中得到验证。

共有1个答案

訾朗
2023-03-14

你的正则表达式很好。它似乎是为多行匹配而设计的。

在regex101演示中,多行(/gm)标志与全局标志一起已在regex选项下启用。

此外,您还可以使用Java Flavor(为了安全起见,目标环境支持您的正则表达式的所有功能)。

使用多行匹配时,可以使用标志模式。多行

公共静态最终int MULTILINE

启用多行模式。在多行模式下,表达式^和$分别在输入序列的行结束符或结尾之后或之前匹配。默认情况下,这些表达式仅在整个输入序列的开头和结尾匹配。

多行模式也可以通过嵌入式标志表达式(?m)

参见:使用模式。java正则表达式中的多行

雅加达Bean Validation 2.0基于Bean Validation 2.0(JSR 380)。参见参考文件:

@模式(regex=,flags=)

检查带注释的字符串是否匹配正则表达式regex,考虑给定的标志匹配

请参阅IDEone上的演示:

public static void main(String[] args) throws java.lang.Exception {
  final Pattern simple = Pattern.compile("^[0-9]{13} {4}$");
  final Pattern singleline = Pattern.compile("^(0$|[^0][0-9]*)");
  final Pattern multiline =
      Pattern.compile("^(0$|[^0][0-9]*)", Pattern.MULTILINE);

  final String input = "0\ncat\n1234\n007\n09980514122516231246";

  System.out.println(simple.matcher(input).find()); // prints: false
  System.out.println(singleline.matcher(input).find()); // prints: false
  System.out.println(multiline.matcher(input).find()); // prints: true

  for (String line : input.split("\n")) {
    System.out.println(line + ":\t"
        + multiline.matcher(line).find()); // prints: true, true, true, false, false
  }
}

⚠️ 为什么cat匹配为true

因为它不是一个单一的0,也不是以0开头,后面跟着任何(甚至没有!)数字。也许我们应该改变第一个数字来匹配[1-9]

多行标志作为参数添加到注释@Pattern

@Pattern(regexp = "^(0$|[^0][0-9]*)", flag = Pattern.MULTILINE)
@Length(min = 1, max = 20)
private String begDate;

您还可以在正则表达式中包含有效的长度范围:

^(0$|[^0]\d{,19})

  • 删除了任何时间量词*
  • 而是添加了范围量词{0,19}:前面的模式(数字[0-9]\d)应该发生在0到19次之间,因为。

加上第一个非0位(预计总共20位)或单个0的边缘大小写。

 类似资料:
  • 我正在IntelliJ开发一个Web应用程序,Java /Jakarta,Maven和Tomcat 10。因此,我想使用JSTL标签,但无法让它们工作。 通过Maven,我添加了org。玻璃鱼。网址:雅加达。servlet。jsp。jstl:2.0.0。我的项目。我还在Tomcat/lib文件夹中添加了jar文件。 在我添加的jsp文件中: 为了解决“绝对uri:http://java.sun.c

  • 在根据https://wiki.eclipse.org/new_maven_coordines和Maven central从Java 8迁移到Java 11并从EE切换到最新的Jakarta库时,我们在(仍然基于SOAP的)客户端应用程序中遇到了以下运行时异常: Getting java.lang.ClassNotFoundException:com.sun.xml.internal.ws.spi

  • 我试图用Jakarta mail 2.0.0发送邮件,但应用程序最终“冻结”,没有任何消息。当SocketFetcher类试图实例化静态“MailLogger”成员时,就会发生这种情况。我已经下载并编译了JAF2.0.0源文件。 有人看到了吗? Android Studio 4.1.1 with OpenJdk 11.0.2 on Windows 奥维

  • 下一个例外,我目前没有答案。。。 在Wildfly 24和Java 16上升级后,出现以下异常: 19:23:08420错误[org.jboss.msc.service.fail](msc服务线程1-4)MSC000001:无法启动服务jboss。部署。单元“根,战争”。POST_模块:org。jboss。理学硕士。服务服务jboss中的StartException。部署。单元“根,战争”。POS

  • JPA 3.0于2020年11月发布,我想大多数JPA提供商(Hibernate、EclipseLink、OpenJPA)仍然支持JPA 2.2。是否有迁移到新版本的计划?这将不是那么简单,因为,例如,顶级包已经更改(javax.persistence-

  • 这个项目当然也有控制器调用的服务。因为它是一个Spring项目,所以用@Service注释对它们进行了注释。 当然,现在我想知道如何将这一点转移到雅加达世界。 用@stateless(我不需要@statelable)注释它的唯一方法是吗? 如果我使用@stateless,我必须把它放在实现类的接口上吗?或者,如果我把它放在接口上,它会被实现类继承吗?