FluentValidation i regex - walidacja adresu

0

Cześć,

napisałem sobie regexa, który miałby mi sprawdzić czy adres jest w następującej formie:

Ulica numer, kod_pocztowy miasto

Gdy go testuję na regex storm to jest ok. Jednak Fluent Validation nie waliduje go poprawnie. Co robię źle?

http://regexstorm.net/tester?p=%5e%28%28%28%5bA-za-z%c4%85%c4%87%c4%99%c5%82%c5%84%c3%b3%c5%9b%c5%ba%c5%bc%c4%84%c4%98%c5%81%c5%83%c3%93%c5%9a%c5%b9%c5%bb%5d%29%2b%28.%29%7b0%2c1%7d%28%5cs%29%29*%28%5bA-Z%c4%84%c4%98%c5%81%c5%83%c3%93%c5%9a%c5%b9%c5%bb%5d%29%5ba-z%c4%85%c4%87%c4%99%c5%82%c5%84%c3%b3%c5%9b%c5%ba%c5%bc%5d%2b%28%5cs%29%29%2b%5b0-9%2f%5d%2b%28%2c%29%28%5cs%29%5b0-9%5d%7b2%7d%28-%29%5b0-9%5d%7b3%7d%28%28%5cs%29%28%5bA-Z%5d%29%5ba-z%c4%85%c4%87%c4%99%c5%82%c5%84%c3%b3%c5%9b%c5%ba%c5%bc%5d%2b%29%2b%24&i=Fasolowa+13%2c+02-482+Warszawa&o=m

RuleFor(x => x.ttk_wartosc)
                .Matches(@"^((([A-za-ząćęłńóśźżĄĘŁŃÓŚŹŻ])+(.){0,1}(\s))*([A-ZĄĘŁŃÓŚŹŻ])[a-ząćęłńóśźż]+(\s))+[0-9/]+(,)(\s)[0-9]{2}(-)[0-9]{3}((\s)([A-Z])[a-ząćęłńóśźż]+)+$")
                    .When(x => x.ttk_ttkt_id == (int)DebtorContactType.Address)
                         .WithMessage("Podany adres wydaje się nieprawidłowy, adres musi być podany w następujący sposób: [Ulica] [Numer], [Kod pocztowy] [Miasto].");
0

Sprawdź tak:

^((([A-za-ząćęłńóśźżĄĘŁŃÓŚŹŻ])+(.){0,1}(\s))*([A-ZĄĘŁŃÓŚŹŻ])[a-ząćęłńóśźż]+(\s))+[0-9]+(,)(\s)[0-9]{2}(-)[0-9]{3}((\s)([A-Z])[a-ząćęłńóśźż]+)+$
0

Najprawdopodobniej robisz źle próbując rozwiązać problem regexpem zamiast odpowiednim modelem

2

Niezależnie od problemu, twój regexp nie zadziała w paru oczywistych przypadkach:

ul. 3 Maja 13, 00-121 Warszawa
ul. Maja 13a/21, 00-121 Warszawa
ul. Jana Pawła II 21, 00-121 Warszawa
ul. gen. Tadeusza Bór-Komorowskiego 22, 00-121 Test
Ulan-Majorat 39, 00-121 Warszawa

3

Jak to nie jest do poćwiczenia regexa, to to najzwyczajniej nie ma sensu ani z programistycznego ani biznesowego ani funkcjonalnego punktu widzenia.

Jak już mają być takie mocne restrykcje, to chyba lepiej rozbić to na kilka inputów i tworzyć pożądany format w kodzie.

0
kobi55 napisał(a):

Gdy go testuję na regex storm to jest ok. Jednak Fluent Validation nie waliduje go poprawnie. Co robię źle?

Co to znaczy "nie waliduje poprawnie"? Zwraca sukces?
Czy to jedyna reguła tego walidatora?
Warunek w When spełniony?

0

@somekind: Wrzucam ten sam adres co w regexstorm i dostaję zwrotkę z WithMessage(), czyli fluentvalidation twierdzi, że jednak adres nie pasuje do regexa.
@urke: Dziękuję za Twój wkład, jednak nie pytam o to czy ten regex ma sens ;) Waliduję adresy z pliku tekstowego. Biznes sobie wymyślił, że mają one być tylko i wyłącznie w takim formacie w tym pliku. Z biznesem się nie dyskutuje, to on płaci ;)

1

@kobi55: czyli problem polega na tym, że FluentValidation uważa prawidłowy adres za nieprawidłowy?

0

@somekind: Dokładnie tak, wybacz, że nie opisałem tego wystarczająco jasno. FluentValidation uważa za nieprawidłowy adres, który wg. regex storm pasuje do tego regexa.

0

A co to jest za slash tutaj: [0-9/]+?

0

@somekind: Jest on po to żeby numer mógł być numer lokalu podany, np: Fasolowa 13/5, 02-482 Warszawa. Pewnie można to napisać lepiej :)

0

No obecnie to mi to nie wygląda na prawidłowy Regex, myślę, że slashe trzeba escapować, przy użyciu \.

Ogólnie polecam sprawdzać tutaj: https://regex101.com/

0

@somekind: wyescapowalem, wrzuciłem na regex101, jest ok. W FluentValidation nadal nie przechodzi.

/^((([A-za-ząćęłńóśźżĄĘŁŃÓŚŹŻ])+(.){0,1}(\s))*([A-ZĄĘŁŃÓŚŹŻ])[a-ząćęłńóśźż]+(\s))+[0-9\/]+(,)(\s)[0-9]{2}(-)[0-9]{3}((\s)([A-Z])[a-ząćęłńóśźż]+)+$

1

Klasy:

enum DebtorContactType
{
    Address = 1,
}

class TempRequest
{
    public int Type { get; set; }
    public string Address { get; set; }
}

class TempRequestValidator : AbstractValidator<TempRequest>
{
    public TempRequestValidator()
    {
        RuleFor(x => x.Address)
            .Matches(@"^((([A-za-ząćęłńóśźżĄĘŁŃÓŚŹŻ])+(.){0,1}(\s))*([A-ZĄĘŁŃÓŚŹŻ])[a-ząćęłńóśźż]+(\s))+[0-9\/]+(,)(\s)[0-9]{2}(-)[0-9]{3}((\s)([A-Z])[a-ząćęłńóśźż]+)+$")
            .When(x => x.Type == (int)DebtorContactType.Address)
            .WithMessage("Podany adres wydaje się nieprawidłowy, adres musi być podany w następujący sposób: [Ulica] [Numer], [Kod pocztowy] [Miasto].");
    }
}

Test:

public class TempRequestValidator Tests
{
    [Fact]
    public void Temp_Test()
    {
        var request = new TempRequest
        {
            Type = 1,
            Address = "Fasolowa 13, 02-482 Warszawa",
        };

        var validationResult = new TempRequestValidator().TestValidate(request);
        validationResult.ShouldNotHaveAnyValidationErrors();
    }
}

Wynik:
screenshot-20210126105621.png

U mnie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1