Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inne]Zadanie z wyrażeń regularnych
olszam
post
Post #1





Grupa: Zarejestrowani
Postów: 342
Pomógł: 23
Dołączył: 20.01.2011
Skąd: Chełm

Ostrzeżenie: (0%)
-----


Ostatnio tak sobie szukałem jakiś zadań z wyrażeń regularnych bo wypadałoby poćwiczyć chociaż trochę i coś ogarnąć z tego i natrafiłem na takie zadanie

Write one regular expression to match the following three phrases. The expression must capture the values of latitude, longitude, city, and state into regex groups 1, 2, 3, and 4.
"lat":"42.350645","lon":"-71.130995 ","city":"Boston","state":"MA"
"lat":"","lon":,"city":"NEW YORK","state":"NY"
"lat":"33.68223755","lon":"-112 ","city":"Phoenix","state":"az"

Jednym wyrażeniem regularnym mam wyciągnąć i pogrupować na długość, szerokość geograficzną, miasto i stan. Na chwilę obecną mam tylko tak
Kod
@"""lat"":""(?<group1>[+-]?(\d+\.\d+)?(\d+))[\s]*"",""lon"":""(?<group2>[+-]?(\d+\.\d+)?(\d+))[\s]*"",""city"":""(?<group3>\w+)"",""state"":""(?<group4>\w{0,2})""";
///pod ide Visual studio dostosowane

wyciąga w miarę tak jak trzeba ale z drugiej pozycji nie chce mi przypisać miasta i stanu do grupy 3 i 4
mam jeszcze tak
Kod
@"((""lat"":""(?<group1>([+-]?(\d+\.\d+)(\d+))[\s]*)"")|(""lon"":""(?<group2>([+-]?(\d+\.\d+)?(\d+))[\s]*)"")|(""city"":""(?<group3>(\w+\s?)*)"")|(""state"":""(?<group4>(\w{0,2}))""))";

ale też nie daje mi tego efektu w pętli co trzeba.

z tego co wiem to efekt końcowy dla zadania powinien być taki:
Cytat
42.350645,-71.130995,Boston,MA
,,NEW YORK,NY
33.68223755,-112,Phoenix,az


w pierwszym przypadku brakuje całości z drugiej linii a w drugim przypadku wychodzi tak
Cytat
42.350645,,,
,-71.130995,,
,,Boston,
,,,MA
.......
////i podobnie jest dla reszty

nie wiem co robię źle akurat tutaj już trochę czasu kombinuje i nic nie mogę wymyślić.
w PHP i C# próbuję to robić i nadal ten sam efekt, a c# zainstalowany bo może przydało by się porobić coś w nim od czasu do czasu (IMG:style_emoticons/default/happy.gif) .

Ten post edytował olszam 11.09.2016, 15:40:20
Go to the top of the page
+Quote Post
lukaskolista
post
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. $value = '"lat":"42.350645","lon":"-71.130995 ","city":"Boston","state":"MA"';
  4. preg_match('/"lat"\:"(?<lat>[^"]+)"/', $value, $matches);
  5.  
  6. var_dump($matches['lat']);

Nie wiem po co Ci takie skomplikowane wyrażenie.

Dodam jeszcze, że funkcje preg_... przyjmują wyrażenia w formacie PCRE, więc jak szukasz przykładów to zwracaj na to uwagę, czy są w POSIX, czy PCRE.

Ten post edytował lukaskolista 11.09.2016, 16:40:33
Go to the top of the page
+Quote Post
Pyton_000
post
Post #3





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Uhmm...
http://sandbox.onlinephpfunctions.com/code...6bdd3ec6f74eec5
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Żadne z powyższych wyrażeń nie jest dopasowane do wzorca (przepuszcza wszystko).
Autor jak domniemam chciał znaleźć dokładne wzorce (czyli floating point/integer dla szerokości i długości, wyraz/wyrazy dla miasta i dwuznakowy kod ANSI stanu - wielkie litery/małe litery).
olszam - długość geograficzna przyjmuje wartości od -180 do 180, szerokość -90 do 90. Może Ci się przyda.

Ten post edytował trueblue 11.09.2016, 16:41:42
Go to the top of the page
+Quote Post
lukaskolista
post
Post #5





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


Python_000 uhmmm sprawdzałem na http://phptester.net/ i działało, podany przez Ciebie sandbox zmienia treśćwyrażenia regularnego więc zanim ktoś napisze, że nie działa, to proponuję popatrzeć dokładnie, jaki kod się wykonał.

@trueblue - spokojnie, działa (IMG:style_emoticons/default/smile.gif)

Ten post edytował lukaskolista 11.09.2016, 16:43:56
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


lukasolista,
zgadza się, temu nie przeczę. Ale przepuszcza: "lat":"eeee"
Go to the top of the page
+Quote Post
olszam
post
Post #7





Grupa: Zarejestrowani
Postów: 342
Pomógł: 23
Dołączył: 20.01.2011
Skąd: Chełm

Ostrzeżenie: (0%)
-----


Cytat
Autor jak domniemam chciał znaleźć dokładne wzorce (czyli floating point/integer dla szerokości i długości, wyraz/wyrazy dla miasta i dwuznakowy kod ANSI stanu - wielkie litery).

Zgadza się.

Ehh, zapomniałem dodać że te wartości to są przypisane do jednej zmiennej czyli by wyglądałoby to tak
  1. $str = '"lat":"42.350645","lon":"-71.130995 ","city":"Boston","state":"MA"\n'+
  2. '"lat":"","lon":,"city":"NEW YORK","state":"NY"\n'+
  3. '"lat":"33.68223755","lon":"-112 ","city":"Phoenix","state":"az""';


Ten post edytował olszam 11.09.2016, 16:47:58
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Dobra , założyłem że olewamy poprawność danych (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
lukaskolista
post
Post #9





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


@trueblue - już nie przepuszcza. Zastanawiam się, czy ten temat jest w przedszkolu, czy w gotowych rozwiązaniach.
  1. <?php
  2.  
  3. $value = '"lat":"42.350645","lon":"-71.130995 ","city":"Boston","state":"MA"';
  4. preg_match('/"lat"\:"(?<lat>\-?\d{1,2}\.\d+)"/', $value, $matches);
  5.  
  6. var_dump($matches['lat']);


Ten post edytował lukaskolista 11.09.2016, 17:04:12
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


lukaskolista,
nie chciałbym aby odebrane to było jako złośliwość. Ale wartość może być pusta lub brak, może być integer, może również na końcu pojawić się spacja.

Widać to w przykładzie:
"lon":"-71.130995 ",
'"lat":"","lon":,
"lon":"-112 ",
Go to the top of the page
+Quote Post
olszam
post
Post #11





Grupa: Zarejestrowani
Postów: 342
Pomógł: 23
Dołączył: 20.01.2011
Skąd: Chełm

Ostrzeżenie: (0%)
-----


http://sandbox.onlinephpfunctions.com/code...443759943f8ded7
a tego już tak nie przerobie (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
trueblue
post
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ja tyle zdążyłem kiedy jeszcze wydawało się, że przetwarzamy jedną linię:
https://regex101.com/r/wM0mM7/1
Nie uwzględnia pustych lub braku.
Go to the top of the page
+Quote Post
by_ikar
post
Post #13





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


jak chcesz poćwiczyć wyrażeń, to tutaj polecam te puzzle: https://regexcrossword.com/
Go to the top of the page
+Quote Post
lukaskolista
post
Post #14





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


Uważam, że nie ma co dopasowywać do konkretnego formatu - liczy się jakakolwiek wartość. Później taką wartość można sobie zwalidować i wyświetlić użytkownikowi komunikat o błędzie lub o powodzeniu lub zrobić cokolwiek innego. Wartość błędna to też wartość, jak podasz eee jako szerokość geograficzna, to znaczy, że podałeś szerokość geograficzną, tylko nieprawidłową. To, że dopasujesz do liczb nie oznacza, że wartość szerokości będzie poprawna, bo np. szerokość geograficzna o wartości
361.1234 jest zupełnie niepoprawna. Idealnie pasuje tutaj Value Object, który z założenia posiada swój wewnętrzny walidator i nie zależy od żadnych walidatorów zewnętrznych. Wtedy robisz sobie new Latitude($value) i jak nie dostaniesz wyjątku podczas instancjonowania klasy Latitude to znaczy, że podana szerokość jest poprawna.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 11:57