Wyrażenia regularne Java nazwa miasta

Monia678
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 23 paź 2010, o 18:25
Płeć: Kobieta
Lokalizacja: warszawa
Podziękował: 6 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Monia678 »

Witam. Zwracam się do Was w ostatecznośći po 3 godzinach prób. Oczy mnie już bolą i już nie wiem czego innego spróbwać.

Kod: Zaznacz cały

<td><a href="/wiki/Letnie_Igrzyska_Olimpijskie_1896" title="Letnie Igrzyska Olimpijskie 1896">IO 1896</a></td>
<td>5-15 IV</td>
<td><a href="/wiki/Ateny" title="Ateny">Ateny</a></td>
<td><a href="/wiki/Grecja" title="Grecja">Grecja</a></td>
<td>13</td>
<td>245</td>
<td>0</td>
<td>43</td>
</tr>
Chcę z tego tekstu przy pomocy wyrażeń regularnych w javie uzyskać Ateny(Grecję również bo regex będzie ten sam).
Próbowałam dziesiątki opcji w tym np. regex = ""[A-Z][a-z]+"" czyli cudzysłowie, duża litera od A-Z, następnie ciąg dowolnej długości małych do kolejnego cudzysłowia. Tyle że muszę to źle zapisywać bo nie działa. Jeżeli chodzi o resztę programu to wszystko jest ok (lata już wysupłałam z kodu przy pomocy regexa="\s[1]{1}[8-9]{1}[0-9]{2}" i wszystko chula, ale tu jestem bezradna).
Proszę o pomoc.
Tak też: regex = "\s.{7}"[A-Z]\p{L}+"";

A i dla informacji, to nie jest tak żę operuję na całym kodzie tej strony(jak widać wikipedia igrzyska letnie) wcześniej już wycięłam wyrażęniami regularnymi sam kod tabeli(więc reszta kodu strony nigdzie mi się nie plącze.)-- 15 sty 2011, o 23:17 --Podpierałam się tym:
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Afish »

Takie coś powinno zadziałać, tylko że złapie też cudzysłowy:

Kod: Zaznacz cały

["][a-zA-zs]{1,}["]
Monia678
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 23 paź 2010, o 18:25
Płeć: Kobieta
Lokalizacja: warszawa
Podziękował: 6 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Monia678 »

Niestety komputer się zawiesił i straciałam treść swojego posta.
Niestety eclipse nie dopuszcza takiego formatu:
["][a-zA-z\s]{1,}["]
"["][a-zA-z\s]{1,}["]"
Dopuszcza taki:
"\"][a-zA-z\\s]{1,}\"]"
ale nic nie dopasował.
Zamieszczę cały kod programu(JEGO IDEA JEST PROSTA JAK BUDOWA CEPA, NAPRAWDĘ i kod działa, tylko regexa nie umiem znaleźć, na bieżącym etapie mamy już wyłuskany sam kod tabeli i na nim już tylko operujemy, no i jeszcze lata w których odbyły się igrzyska), jednakże pokrótce go opiszę.
Należy mieć plik 1.txt na dysku D, z kodem źródłowym strony:
pobierzDaneZPliku pobiera treść pliku tekstowego i wypluwa Stringa

ArrayList<String> poszukiwanieWzorca(String txt, String regex) dopasowuje wzorzec regex do Stringa txt i wypluwa tablicę z dopasowanymi Stringami

Jest to dla mnie bardzo ważne, bo to pierwsze zadanie w tym półroczu z którym nie mogę sobie poradzić, co jest dla mnie irytujące,a nie chcę żeby mi przepadł punkt za nie, zwłaszcza że odwaliłam już prawie całą robotę i siedziałam nad tym parę godzin.

Kod: Zaznacz cały

import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Io {

	public Io() {

	}

	public static String pobierzDaneZPliku(String ścieżka) throws IOException {
		FileInputStream is = new FileInputStream(ścieżka);
		StreamTokenizer st = new StreamTokenizer(new FileReader(ścieżka));
		StringBuffer napis = new StringBuffer("");
		int n = 0;
		while ((st.TT_EOF != st.nextToken())) {
			if (st.ttype == st.TT_NUMBER) {
				napis.append(st.nval);
			}
			if (st.ttype == st.TT_WORD) {
				napis.append(st.sval);
			}
			napis.append(" ");
			n = n + 1;
		}
		System.out.println(napis);
		String tekstZPliku = napis.toString();

		return tekstZPliku;
	}

	public static ArrayList<String> poszukiwanieWzorca(String txt, String regex) {
		 // Wzorzec: jedno lub więcej wystąpień dowolnej cyfry
//	    String regex = "table class.+(w klasyfikacji)";
	    //<table class="wikitable" style="empty-cells: show; text-align:center;" border="1">
	    
	    System.out.println("Tekst: \n" + "'" + txt + "'" + 
	                       "\nWzorzec: " + "'" + regex + "'");

	    // Kompilacja wzorca
	    Pattern pattern = Pattern.compile(regex);

	    // Uzyskanie matchera
	    Matcher matcher = pattern.matcher(txt);
	    
	    String wynik = "";  // do prezentacji wyników wyszukiwania
	    ArrayList<String> koniec = new ArrayList<String>();    
	    while (matcher.find()) {
	      koniec.add(matcher.group());
	    	wynik += "\nDopasowano podłańcuch '" + 
	        matcher.group() + "'" +                // group() zwraca ostatni dopasowany tekst 
	        "\nod pozycji " + matcher.start() +    // start() zwraca jego poczatkową pozycję
	        "\ndo pozycji " + matcher.end();       // end() zwraca pozycję po ostatnim dopasowanym znaku
	    }
	    
	 
	    if (wynik.equals("")){
	    	wynik = "Nie znaleziono żadnego podnapisu pasującego do wzorca";
	    }
	    System.out.println();
	    System.out.println(koniec.size());                              
		return koniec;
	}

	public static void main(String[] args) throws IOException {
		String ścieżka = "d:\\1.txt";
	//	System.out.println(pobierzDaneZPliku(ścieżka));
		//String regex = "table class.+(w klasyfikacji)";
		String regex =  "IO 1896.+";
		ArrayList<String> pom = poszukiwanieWzorca(pobierzDaneZPliku(ścieżka ), regex);		
		String pom2 = pom.get(0);
		System.out.println (pom2);
// teraz przygotujemy ArrayLista ArrayList, będziemy generować arraylista z latami i go wrzucać do tej tablicy(nie będziemy działać na
		//arraylist od arraylist itd., tak dopiero przy wypisywaniu
		ArrayList<ArrayList<String>> dane = new ArrayList<ArrayList<String>>();
		regex = "\\s[1]{1}[8-9]{1}[0-9]{2}";//wzorzec dla lat bo są tam jakieś inne liczby. Spacja, jedynka, 8 albo 9, 2 cyfry.
		ArrayList<String> lata = poszukiwanieWzorca(pom2, regex);
		System.out.println(lata);
		dane.add(lata);
		//regex dla miasta i państwa będzie ten sam i będą się wpisywały pod tę samą komórkę razem
		regex = "\"][a-zA-z\\s]{1,}\"]";
		ArrayList<String> miastaiPanstwa = poszukiwanieWzorca(pom2, regex);
		System.out.println(miastaiPanstwa);
		//<td><a href="/wiki/Ateny" title="Ateny">Ateny</a></td>
	}

}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Afish »

Kod: Zaznacz cały

"["][a-zA-z\s]{1,}["]"
Netbeans nie protestuje, a wynik jest poprawny.
Monia678
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 23 paź 2010, o 18:25
Płeć: Kobieta
Lokalizacja: warszawa
Podziękował: 6 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Monia678 »

No to ściągam netbeansa, bo u mnie:
0

[]
Ale to przecież jest niby niemożliwe bo java ma działać wszędzie tak samo. No to ściągam netbeansa.
Daję jeszcze screena, żebyś mógł zobaczyć. Może robię jakiś głupi błąd i z góry przepraszam, że tak zrzędzę, ale nie działa mimo że jak sam mówisz powinno.


Admini: Z tego co pamiętam nie wolno wklejać zdjęć, tyle że w dziale informatyka uważam to za w pełni uzasadnione.

-- 16 sty 2011, o 12:28 --

Zainstalowałam NetBeans. Dokładnei to samo:
Wzorzec: '["][a-zA-z\s]{1,}["]'

0
[]
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Afish »

Przejrzałem kod programu i problem jest nie w regexach, a we wczytywaniu pliku. Przy odczytywaniu danych wycinasz StringTokenizerem wszystkie znaczniki htmlowe, znaki interpunkcyjne i znaki specjalne.
Monia678
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 23 paź 2010, o 18:25
Płeć: Kobieta
Lokalizacja: warszawa
Podziękował: 6 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Monia678 »

Ok więc spróbowałam trochę zmienić:
regex = "a href title \\w+\\S";
Wzorzec: 'a href title \w+\S'

243
[a href title Ateny, a href title Grecja, a href title IO, a href title ParyĹ, a href title Francja, a href title IO itd.

No tylko jak pozbyć się tego IO ?

-- 16 sty 2011, o 13:25 --

Miasta i Państwa działają, teraz daty.

Kod: Zaznacz cały

import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Io {

	public Io() {

	}

	public static String pobierzDaneZPliku(String ścieżka) throws IOException {
		FileInputStream is = new FileInputStream(ścieżka);
		StreamTokenizer st = new StreamTokenizer(new FileReader(ścieżka));
		StringBuffer napis = new StringBuffer("");
		int n = 0;
		while ((st.TT_EOF != st.nextToken())) {
			if (st.ttype == st.TT_NUMBER) {
				napis.append(st.nval);
			}
			if (st.ttype == st.TT_WORD) {
				napis.append(st.sval);
			}
			napis.append(" ");
			n = n + 1;
		}
		System.out.println(napis);
		String tekstZPliku = napis.toString();

		return tekstZPliku;
	}

	public static ArrayList<String> poszukiwanieWzorca(String txt, String regex) {
		 // Wzorzec: jedno lub więcej wystąpień dowolnej cyfry
//	    String regex = "table class.+(w klasyfikacji)";
	    //<table class="wikitable" style="empty-cells: show; text-align:center;" border="1">
	    
	    System.out.println("Tekst: \n" + "'" + txt + "'" + 
	                       "\nWzorzec: " + "'" + regex + "'");

	    // Kompilacja wzorca
	    Pattern pattern = Pattern.compile(regex);

	    // Uzyskanie matchera
	    Matcher matcher = pattern.matcher(txt);
	    
	    String wynik = "";  // do prezentacji wyników wyszukiwania
	    ArrayList<String> koniec = new ArrayList<String>();    
	    while (matcher.find()) {
	      koniec.add(matcher.group());
	    	wynik += "\nDopasowano podłańcuch '" + 
	        matcher.group() + "'" +                // group() zwraca ostatni dopasowany tekst 
	        "\nod pozycji " + matcher.start() +    // start() zwraca jego poczatkową pozycję
	        "\ndo pozycji " + matcher.end();       // end() zwraca pozycję po ostatnim dopasowanym znaku
	    }
	    
	 
	    if (wynik.equals("")){
	    	wynik = "Nie znaleziono żadnego podnapisu pasującego do wzorca";
	    }
	    System.out.println();
	    System.out.println(koniec.size());                              
		return koniec;
	}

	public static void main(String[] args) throws IOException {
		String ścieżka = "d:\\1.txt";
	//	System.out.println(pobierzDaneZPliku(ścieżka));
		//String regex = "table class.+(w klasyfikacji)";
		String regex =  "IO\\s1896.*?w\\sklasyfikacji";
		ArrayList<String> pom = poszukiwanieWzorca(pobierzDaneZPliku(ścieżka ), regex);		
		String pom2 = pom.get(0);
		System.out.println (pom2);
// teraz przygotujemy ArrayLista ArrayList, będziemy generować arraylista z latami i go wrzucać do tej tablicy(nie będziemy działać na
		//arraylist od arraylist itd., tak dopiero przy wypisywaniu
		ArrayList<ArrayList<String>> dane = new ArrayList<ArrayList<String>>();
		regex = "\\s[1]{1}[8-9]{1}[0-9]{2}";//wzorzec dla lat bo są tam jakieś inne liczby. Spacja, jedynka, 8 albo 9, 2 cyfry.
		ArrayList<String> lata = poszukiwanieWzorca(pom2, regex);
		System.out.println(lata);
		dane.add(lata);
		//regex dla miasta i państwa będzie ten sam i będą się wpisywały pod tę samą komórkę razem
		regex = "a href   title    \\w+\\S";
		ArrayList<String> miastaiPanstwa = poszukiwanieWzorca(pom2, regex);
		System.out.println(miastaiPanstwa);
		String pomoc = "";
		for (int i = 0;i < miastaiPanstwa.size();i++){
			pomoc = pomoc+ " " + miastaiPanstwa.get(i);
		}
		regex = "[A-Z][a-z]+";
		miastaiPanstwa = poszukiwanieWzorca(pomoc, regex);
		System.out.println(miastaiPanstwa);
		//<td><a href="/wiki/Ateny" title="Ateny">Ateny</a></td>
	}

}
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Wyrażenia regularne Java nazwa miasta

Post autor: Afish »

Kod: Zaznacz cały

([0-9]+.0){0,1} [-]{0,}[0-9]{1,}.0 [IVX]{1,}
ODPOWIEDZ