FluentValidation i regex - walidacja adresu

FluentValidation i regex - walidacja adresu
K5
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
  • Postów:141
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

Kopiuj
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].");
edytowany 1x, ostatnio: kobi55
lukaszek016
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:249
0

Sprawdź tak:

Kopiuj
^((([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ąćęłńóśźż]+)+$
VA
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 dni
0

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

K5
To jest specyficzny przypadek, adres pochodzi z pliku tekstowego i ja mam go tylko zwalidować. Ma być dokładnie w takiej formie jak sobie biznes zażyczył.
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około godziny
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

K5
Dzięki za zwrócenie na to uwagi ;)
UR
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 3 lata
  • Postów:360
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.

edytowany 1x, ostatnio: urke
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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?

edytowany 1x, ostatnio: somekind
K5
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
  • Postów:141
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 ;)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1

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

K5
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
  • Postów:141
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.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
0

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

K5
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
  • Postów:141
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 :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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/

edytowany 1x, ostatnio: somekind
K5
  • Rejestracja:ponad 10 lat
  • Ostatnio:12 miesięcy
  • Postów:141
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ąćęłńóśźż]+)+$

edytowany 1x, ostatnio: kobi55
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
1

Klasy:

Kopiuj
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:

Kopiuj
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.

edytowany 1x, ostatnio: somekind
K5
Okazało się, że jestem debilem. Nie wpadłem na zrobienie TRIMa na danych i się ostała jakaś zbłąkana spacja. Dzięki!
somekind
No tak, zagubione białe znaki to zmora. :)
K5
Owszem :) jeszcze raz dziękuję za pomoc ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.