Zapis wyrażenia regularnego sprawdzającego czy podane miasto jest jedno lub dwuczłonowe

0

Witam,

Mam problem z wyrazeniem regularnym . Poniewaz dla przykladow :

formatuj_Adres("80-227 GDAŃSK                              DOSTUDZIENKI 666");
formatuj_Adres("83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 666"); 

Moje wyrazenie:

String REGEX_Miasto_Dwu_Czlonowe="\\D+\\s\\D+";
Pattern pat_Miasto = Pattern.compile(REGEX_Miasto_Dwu_Czlonowe);      
Matcher mat_Miasto_Dwu_Czlonowe = pat_Miasto.matcher(adres);

powyzszy wzorzec jest poprawny dla pierwszego i drugiego przykadu, a zalezy mi, zeby tylko byl poprawny dla drugiego

if(mat_Miasto_Dwu_Czlonowe.find()) System.out.println(" miasto2czlonowe find");

dodanie znaczników <code class="java"> - Furious Programming

0

Tak, tylko wczesniej chodzilo o wyrazenie regularne dotyczace ogolnego adresu.
A teraz chce sprawdzic czy podane miasto jest jedno badz dwu czonowe

0

Za bardzo kombinujesz. Wyrażenie regularne to nie lekarstwo na każde parsowanie.
Przerabiając twój przykład popatrz na te dwa zmyślone adresy:

0-227 GDAŃSK PLAC ZBAWICIELA 666
83000 PRUSZCZ GDANSKI TYSIACLECIA 666

Bez znajomości języka naturalnego NIE DA SIĘ zlokalizować miejsca rozdzielenia ulicy i nazwy miasta.
Co możesz zrobić?
Wyrażeniem regularnym wyłów tylko kod pocztowy, stwórz sobie bazę danych wszystkich możliwych miejscowości i na tej podstawie normalnym kodem ustalaj od którego miejsca zaczyna się nazwa ulicy.
Jeśli się nie mylę w sieci jest dostępna taka baza danych nawet chyba w formie usługi.

0

Tylko właśnie będę otrzymywał dane jak poniżej oddzielone kilkunastoma spacjami.
Tylko z tą różnicą że miasto może być może być jedno bądź dwuczłonowe oddzielone spacją.

formatuj_Adres("80-227 GDAŃSK                              DOSTUDZIENKI 666");
formatuj_Adres("83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 666");

dodanie znacznika <code class="java"> - Furious Programming

0
(\d{2}-?\d{3})\s+(\w+(?:\s\w+)*)\s{4,}(\w.*)
  • cap(1) kod pocztowy
  • cap(2) miasto
  • cap(3) reszta adresu
0

Moje wyrazenie :

String REGEX_Miasto_Dwu_Czlonowe="\\D+\\s\\D+";
Pattern pat_Miasto = Pattern.compile(REGEX_Miasto_Dwu_Czlonowe);      
Matcher mat_Miasto_Dwu_Czlonowe = pat_Miasto.matcher(adres);

i chodzi mi oto żeby odpowiednio sformatować REGEX_Miasto_Dwu_Czlonowe aby pasowało tylko

"PRUSZCZ GDANSKI UL. TYSIACLECIA 666"
a nie jak teraz do

"GDAŃSK                              DOSTUDZIENKI 666"
"PRUSZCZ GDANSKI                     UL. TYSIACLECIA 666"

dodanie znaczników <code> i <code class="java"> - Furious Programming

0

No nie mów mi, że teraz nie potrafisz tego przerobić. Wystarczy zmienić dosłownie jedn znak (by było ładnie 5 znaków).

0

Zastosowaem to wyrazenie :

String REGEX_Miasto_Dwu_Czlonowe="\\w+(?:\\s\\w+)*\\s{4,99}";

i dalej pasuje do :

"GDAŃSK                              DOSTUDZIENKI 666";
"83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 666";

dodanie znaczników <code class="java"> i <code> - Furious Programming

0

radzę popraw wyrażenie używając głowy a nie zmieniając je przypadkowo. Naprawdę wystarczy, że z mojego wyrażenia regularnego usuniesz JEDEN znak i będzie pasowało jedynie do miast dwuczłonowych (by było elegancko trzeba usunąć 5 znaków).

0

Wiekszosc przypadkow obsluzyem, tylko przy ostatnim wystepuje blad :(
a siedze juz ponad 2dni nad tym i bede serdecznie zobowiazany

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
class Adres_Klienta {
    String kod_Pocztowy; 
    String miasto;
    String ulica;
}
*/
public class Miejscowosci {
   
   
/**
 * @param adres
 * @return
 */
static Adres_Klienta formatuj_Adres(String adres) {
Adres_Klienta tmp = new Adres_Klienta();       

//80-227 GDAÑSK                              DO STUDZIENKI 34B
//83047  PRZYWIDZ                            GDAÑSKA 7
//83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 8


//(\d{2}-?\d{3})\s+(\w+(?:\s\w+)*)\s{4,}(\w.*)


//String REGEX_Ogolny_ADRESU = "(\\d{2}-?\\d{3})\\s+(\\w+(?:\\s\\w+)*)\\s{4,}(\\w.*)";


String REGEX_Ogolny_ADRESU   = "\\d\\d-?\\d\\d\\d\\s*([A-Za-zŁłŻżÓóĘęŃÑń.]*\\s*)*.*";
String REGEX_Kod_Pocztowy = "[0-9][0-9][-][0-9][0-9][0-9].*"; 


String REGEX_Czy_Miasto_Dwu_Czlonowe="[A-Za-zŁłŻżÓóĘęŃÑń.]+\\s[A-Za-zŁłŻżÓóĘęŃÑń.]+.*";
String REGEX_Miasto = "[A-Za-zŁłŻżÓóĘęŃÑń]*";


String REGEX_Miasto_2Czlonowe = "[A-Za-zŁłŻżÓóĘęŃÑń]+//s[A-Za-zŁłŻżÓóĘęŃÑń]*";

//String REGEX_Ulica = "[A-Za-z]+?";

int dlugoscAdresu = adres.length();


	Pattern pat_OgolnyAdres = Pattern.compile(REGEX_Ogolny_ADRESU);
	Matcher mat_OgolnyAdres = pat_OgolnyAdres.matcher(adres);
	
	
	//if(mat_OgolnyAdres.matches()) System.out.println("true mat");
	//if(mat_OgolnyAdres.find()) System.out.println("true find");
	
	if(!mat_OgolnyAdres.find()) {
	System.out.println("true find");
		tmp.kod_Pocztowy = "";
		tmp.miasto ="";
		tmp.ulica ="";
		return tmp;
	}
	
	Pattern pat_Kod_Pocztowy = Pattern.compile(REGEX_Kod_Pocztowy);      
    Matcher mat_Kod_Pocztowy = pat_Kod_Pocztowy.matcher(adres);   
    if(mat_Kod_Pocztowy.find()) { 
         tmp.kod_Pocztowy = adres.substring(0, 2) + "-" + adres.substring(3, 6);
         adres = adres.substring(7, dlugoscAdresu);
         adres = adres.trim();
    } 
    else { 
    	 tmp.kod_Pocztowy = adres.substring(0, 2) + "-" + adres.substring(2, 5); 
         adres = adres.substring(6, dlugoscAdresu);
         adres = adres.trim();
    }
       
    
       //System.out.println("adres  =" + adres);
       
       Pattern pat_Czy_Miasto = Pattern.compile(REGEX_Czy_Miasto_Dwu_Czlonowe);      
       Matcher mat_Czy_Miasto_Dwu_Czlonowe = pat_Czy_Miasto.matcher(adres);   
       
       //----------------------Wzorzec miasto jednoczlonowe
       
        Pattern pat_Miasto = Pattern.compile(REGEX_Miasto);      
        Matcher mat_Miasto = pat_Miasto.matcher(adres);   
       
        //----------------------Wzorzec miasto dwuczlonowe
        Pattern pat_Miasto_2Czlon = Pattern.compile(REGEX_Miasto);      
        Matcher mat_Miasto_2Czlon = pat_Miasto_2Czlon.matcher(adres); 
        
        
        
       //if(mat_Miasto_Dwu_Czlonowe.matches()) System.out.println("miasto2czlonowe mat");
       if( (mat_Czy_Miasto_Dwu_Czlonowe.find())) {
           mat_Miasto_2Czlon.find();
           int it = 0;
           int liczba_Spacji = 0;
           String miasto ="";
           System.out.println("2czesciowe");
           int dlugoscWzorca = (mat_Miasto_2Czlon.group()).length();
           System.out.println("2-1czesciowe"+dlugoscWzorca);
           
           
           miasto = adres.substring(0, dlugoscWzorca+1);
           adres = adres.substring(dlugoscWzorca, (adres.length()));
           adres = adres.trim();
              
           
           
           while (adres.charAt(it) != ' ') {
              miasto += adres.charAt(it);
              ++it;
           }
           
           tmp.miasto = miasto;
           adres = adres.substring((miasto.length()), (adres.length()));
           adres = adres.trim();
           tmp.ulica = adres;
           //System.out.println("ulica = "+tmp.ulica);     
       }
       else if( mat_Miasto.find()){
            int dlugoscWzorca = (mat_Miasto.group()).length();
            System.out.println("jedno czlonowe dlugoscWzorca "+dlugoscWzorca);
            tmp.miasto = mat_Miasto.group();
            //System.out.println("tmpmi" + tmp.miasto);
            adres = adres.substring(dlugoscWzorca, (adres.length()));
            adres = adres.trim();
            tmp.ulica = adres;
       }
       
  System.out.println("\nkod = "+tmp.kod_Pocztowy);
  System.out.println("miasto = "+tmp.miasto);
  System.out.println("ulica = "+tmp.ulica);
    return tmp;   
}
        
    public static void main(String[] args) {
 
       /*
       formatuj_Adres("80-227 GDAŃSK                              DOSTUDZIENKI 34B");
       formatuj_Adres("83047  PRZYWIDZ                            GDAÑSKA 7");
       formatuj_Adres("83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 8");
       formatuj_Adres("WARSZAWA                            DOMANIEWSKA 47");
       */
       formatuj_Adres("27-515 TARŁÓW                               CZEKARZEWSKA BN");
        
       
    }

   
}

dodanie znacznika <code class="java"> - Furious Programming

0

Czy wizualnie ten plik tekstowy ma równe kolumny? Jeśli tak otwórz go w Excelu.
Otworzy się kreator importu, w sekcji "Typ danych źródłowych" wybierz stała szerokość, kodowanie takie jakie powinno być, w 2 kroku sprawdź czy kolumny są prawidłowo rozdzielone i zakończyć kreator.
Od teraz dane powinny być w osobnych kolumnach. Z programu Excel możesz sobie wyeksportować do bardziej cywilizowanego formatu np. CSV - ten format obsługuje chyba każdy język.

0

To są dane zimportowane z Excela :(

0
CEWA napisał(a):

To są dane zimportowane z Excela :(

to otwórz w excelu i wyeksportuj jeszcze raz, tym razem w normalny sposób

0

Ale tak wyglada komrka z excela.
Przykadowo dla zakomentowanych danych dziaa poprawnie , a reszty nie :(.
Na 99% jest to winna wzorca.

 /* 
       formatuj_Adres("80-227 GDAŃSK                              DOSTUDZIENKI 666");
       formatuj_Adres("83047  PRZYWIDZ                            GDAÑSKA 6");
       formatuj_Adres("83000  PRUSZCZ GDANSKI                     UL. TYSIACLECIA 666");
       formatuj_Adres("WARSZAWA                            DOMANIEWSKA 666");
       formatuj_Adres("95015  GŁOWNO                              ZŁOTA 666");
       formatuj_Adres("94104  ŁÓD?                                OBYWATELSKA 666");
       formatuj_Adres("96-100 Skierniewice                        Mazowiecka 666"); 
       formatuj_Adres("99300  KUTNO                               ZIELARSKA 666");
       */
       formatuj_Adres("27-515 TARŁÓW                               CZEKARZEWSKA 666");
       formatuj_Adres("91358  ŁÓD?                                UL. MIGDAŁOWA  2666");
       formatuj_Adres("99-300 KUTNO                               UL. CHOPINA 666");

dodanie znacznika <code class="java"> - Furious Programming

0

rozwiazany problem.

poprawne rozwiazanie :

String REGEX_Czy_Miasto_Dwu_Czlonowe="^\\w+\\s\\w+.*";

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