Требуются ли кванторы во всех выражениях Regex? - PullRequest
1 голос
/ 07 августа 2020

Я создаю приложение 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 или несколько совпадений, которые попадают в заданный образец.

Мой вопрос: всегда требуется указывать квантификатор или что? В чем причина отказа моего исходного шаблона регулярного выражения?

1 Ответ

3 голосов
/ 07 августа 2020

Шаблон должен соответствовать всей строке. Класс символов соответствует только одному символу. Если строка может содержать более одного символа, вам понадобится квантификатор.

Btw. ^ в начале регулярного выражения является избыточным. Шаблон всегда должен соответствовать всей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...