[regexp] jak uzyskąc wyrażenie pomiedzy wzorami

Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[regexp] jak uzyskąc wyrażenie pomiedzy wzorami

Post autor: Ser Cubus »

hej, męczę się z tym i nie mogę zrobić. Chciałbym otrzymać kurs waluty z podanego Stringa (w Javie).

...blablablaUSD</kod_waluty> <kurs_kupna>3,1698</kurs_kupna>blablabla...


zamierzam użyć funkcji String.replaceAll( regexp, string), tak aby zostawić wartość liczbową, chyba że znacie inny sposób aby wydzielić tego stringa. Na pewno da się to zrobić dzięki klasie regexp, pattern i matches, ale ja nie potrafię.

Z góry dziękuję za pomoc
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[regexp] jak uzyskąc wyrażenie pomiedzy wzorami

Post autor: kadiii »

Już Ci pisałem przy okazji innego tematu - użyj jednego z dostepnych parserów. Wydobywanie z xml za pomocą regexp-a wydaje się być "nieco" dziwne. Domyślam się, że użycie jakiegoś parsera może być na pierwszy raz kłopotliwe(po prostu trzeba to zrozumieć) dlatego pomogę Ci przykładowym kodem z użyciem parsera SAX (

Kod: Zaznacz cały

http://www.saxproject.org/apidoc/overview-summary.html
).

Przykładowe użycie parsera:

Kod: Zaznacz cały

public class CurrencyParser {

	public static void main(String[] args) {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			SAXParser saxParser = factory.newSAXParser();
			DefaultHandler handler = new DefaultHandler() {

				ArrayList<Currency> currencies = new ArrayList<Currency>();
				Currency currency;
				boolean bSell = false;
				boolean bBuy = false;
				boolean bCode = false;

				public void endDocument() throws SAXException {
					System.out.println("Pobrane waluty : " + currencies);
				}

				public void startElement(String uri, String localName,
						String qName, Attributes attributes)
						throws SAXException {

					if (qName.equals("waluta")) {
						currency = new Currency();
					}

					if (qName.equals("kod_waluty")) {
						bCode = true;
					}

					if (qName.equals("kurs_kupna")) {
						bBuy = true;
					}

					if (qName.equals("kurs_sprzedazy")) {
						bSell = true;
					}

				}

				public void endElement(String uri, String localName,
						String qName) throws SAXException {
					if (qName.equals("waluta")) {
						currencies.add(currency);
					}
				}

				public void characters(char ch[], int start, int length)
						throws SAXException {

					if (bCode) {
						currency.setCode(new String(ch, start, length));
						bCode = false;
					}

					else if (bBuy) {
						currency.setBuy(Double.parseDouble(new String(ch,
								start, length)));
						bBuy = false;
					}

					else if (bSell) {
						currency.setSell(Double.parseDouble(new String(ch,
								start, length)));
						bSell = false;
					}

				}
			};
			saxParser.parse("c:\currencies.xml", handler);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Zwykły bean do przechowywania danych o walucie:

Kod: Zaznacz cały

public class Currency {

	String code;
	double sell;
	double buy;
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public double getSell() {
		return sell;
	}
	public void setSell(double sell) {
		this.sell = sell;
	}
	public double getBuy() {
		return buy;
	}
	public void setBuy(double buy) {
		this.buy = buy;
	}
	
	@Override
	public String toString() {
		return code + " " + sell + " " + buy;
	}

}
Przykładowy plik xml currencies.xml, oczywiście możesz go dowolnie dopasować(potrzebne zmiany w programie). Wartości walut przypadkowe.

Kod: Zaznacz cały

<waluty>
	<waluta>
		<kod_waluty>USD</kod_waluty>
		<kurs_kupna>3.1698</kurs_kupna>
		<kurs_sprzedazy>3.30</kurs_sprzedazy>
	</waluta>
	<waluta>
		<kod_waluty>PL</kod_waluty>
		<kurs_kupna>2.12</kurs_kupna>
		<kurs_sprzedazy>2.30</kurs_sprzedazy>
	</waluta>
	<waluta>
		<kod_waluty>CHF</kod_waluty>
		<kurs_kupna>1.1698</kurs_kupna>
		<kurs_sprzedazy>1.30</kurs_sprzedazy>
	</waluta>
</waluty>
ODPOWIEDZ