【问题标题】:Is quantifiers are required in all the Regex expressions?所有正则表达式都需要量词吗?
【发布时间】:2020-08-07 07:15:04
【问题描述】:

我正在构建一个 Spring Boot 应用程序,其中使用 java.validation.* 验证输入参数。我想检查字母字符、数字和连字符的输入参数。

public class Foo {
    @NotNull @NotEmpty
    @Pattern(regexp = "^[a-zA-Z0-9-]")
    private String subscriberType;

    @NotNull @NotEmpty
    @Size(min = 32, max = 43)
    @Pattern(regexp = "^[a-zA-Z0-9-]")
    private String caseId;

    ......

我正在使用如下的正则表达式。

@Pattern(regexp = "^[a-zA-Z]")

如果我使用上面并给出如下输入参数,

{
    "subscriberType":"prepaid",
    "caseId":"5408899645efabf60844de9077372571"
}

我的验证失败。

Resolving exception from handler [public org.springframework.http.ResponseEntity<java.lang.Object> my.org.presentation.NumberRecycleController.numberRecycle(java.util.Optional<java.lang.String>,my.org.domain.request.NumberRecycleReqDto) 
throws java.lang.Exception]: org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument at index 1 in method: 
public org.springframework.http.ResponseEntity<java.lang.Object> my.org.presentation.NumberRecycleController.numberRecycle(java.util.Optional<java.lang.String>,my.org.domain.request.NumberRecycleReqDto) 
throws java.lang.Exception, with 2 error(s): [Field error in object 'numberRecycleReqDto' on field 'subscriberType': rejected value [prepaid]; codes [Pattern.numberRecycleReqDto.subscriberType,
Pattern.subscriberType,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: 
codes [numberRecycleReqDto.subscriberType,subscriberType]; arguments []; default message [subscriberType],[Ljavax.validation.constraints.Pattern$Flag;@5dcb2ea8,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@3de9c7b1]; 
default message [must match "^[a-zA-Z0-9]"]] [Field error in object 
'numberRecycleReqDto' on field 'caseId': rejected value [35408899645efabf60844de907737257]; codes [Pattern.numberRecycleReqDto.caseId,Pattern.caseId,Pattern.java.lang.String,Pattern]; 
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [numberRecycleReqDto.caseId,caseId]; arguments []; 
default message [caseId],[Ljavax.validation.constraints.Pattern$Flag;@5dcb2ea8,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@61637994]; default message [must match "^[a-zA-Z0-9-]"]]

我已经解决了一些类似的问题并找到了解决方案。如果我使用下面的正则表达式,我可以获得验证成功。

@Pattern(regexp = "^[a-zA-Z0-9-]+"

或

@Pattern(regexp = "^[a-zA-Z0-9-]{1,}"

你能解释一下这里实际发生了什么吗?我知道量词正在寻找给定数量的匹配项。在我的情况下,有 1 个或多个匹配项属于给定模式。

我的问题是,总是需要给出量词还是什么?我的初始正则表达式模式失败的原因是什么?

【问题讨论】:

  • ^[a-zA-Z] 仅检查 first 字符。 ^[a-zA-Z]+ 将检查 所有 个字符。 Regex101

标签: java regex validation


【解决方案1】:

模式必须匹配整个字符串。一个字符类只匹配一个字符。如果字符串可能包含多个字符,则需要量词。

顺便说一句。正则表达式开头的^ 是多余的。模式必须始终匹配整个字符串。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多