regex i lista wartosci

0

Witam,
jako .net'owiec aktualnie zmuszony nauka javy (:D) mam pewien problem z wyrazeniami regularnymi.
pomijajac fakt ze c# wyrazenia roznia sie troche od tych j2ee problem pozostaje taki ze:

majac dlugiego stringa potrzebuje wyciagnac tablice stringow i je odpowiedno poformatowac.

w .net wygladoby to tak, ze robie foreacha dla kazdego stringa pasujacego do regexa i dla kazdego z nich pod jakimis tam warunkami jest robiona odpowiednia funkcja.

w j2ee mam problem taki ze nie mam zielonego pojecia jak poodwolywac sie do poszczegolnych wartosci ( jako ta wartosc zwrocona a nie jako komunikat kompilatora).
probowalem bawic sie splitem, grupami(to jest najbardziej prawdopodobne) no i nie mam juz pomyslow.

za wszelkie info dzieki

0

Pokaż odpowiednik w C#, to przetłumaczymy.
Przy okazji - wyrażenia regularne to Java SE, a nie EE.

0

odpowiednik z c#

 string s = "jakis tam tekst";
            Regex x = new Regex(@"<(.*?)>");
            
            MatchCollection mc = x.Matches(s);
            
            foreach (Match ss in mc)
            {
                if (ss.Value.ToString().Contains("="))
                {
                  
                 // jakis kod  
                  
                }
                else
                {
                   //jakis kod
                }
             }
                

ogolnie 'jakis tam tekst' to kod z xmla - a regex ma pobierac porownywac i pobierac wszystkie stringi, ktore zaczynaja sie od < i koncza na > czyli np deklaracja kategorii z jakimis atrybutami

inne pasujace wyrazenia regularne na to

- @"<(.*?)>"
- "<[^(\S)]>" 
- "[^<>]"
-  <.*?>
0

przepraszam za post pod postem - robie to w j2ee i ostatnim netbeansem

dzieki za pomoc

0
public class RegexTest {
	private final static Pattern pattern = Pattern.compile("<.*?>");

	public static void main(String[] args) {
		String s = "<abc>d<fg>";

		Matcher matcher = pattern.matcher(s);
		while (matcher.find()) {
			String ss = matcher.group();
			
			if (ss.contains("=")) {
				// jakis kod
			} else {
				// jakis kod
			}
		}
	}
}

Jeżeli chcemy otrzymywać wyniki od razu bez < i >, to wystarczy zmienić dwie rzeczy:

  1. Pattern.compile("<.?>") na Pattern.compile("<(.?)>")
  2. matcher.group(); na matcher.group(1);
0

a czy przypadkiem nie bedzie on teraz szukal do 1 pasujacego stringa?
czyli zwroci

false;false;true?

dokladnie chodzi o zbudowanie tablicy pasujacych stringow - zakladam wiec ze moze byc false;false;true;false;true

a dopiero na podstawie tej zbudowanej tablicy, wyszukanie ze wszystkich pasujacych tych, w ktorych jest np znak "="

Pozdrawiam

0
c# napisał(a)

a czy przypadkiem nie bedzie on teraz szukal do 1 pasujacego stringa?
czyli zwroci

false;false;true?

dokladnie chodzi o zbudowanie tablicy pasujacych stringow - zakladam wiec ze moze byc false;false;true;false;true

a dopiero na podstawie tej zbudowanej tablicy, wyszukanie ze wszystkich pasujacych tych, w ktorych jest np znak "="
Przecież jest w pętli... wyszuka pierwszy, potem drugi, trzeci.. jeśli w ogóle jakieś znajdzie. Nie wiem co ty kombinujesz z tymi true i false... wtf?

0

jak to co kombinuje?
z tego co wiem to while wykonuje sie do momentu osiagniecia(wykonania) warunku a ze matcher.find() zwraca boolena to z logicznego punktu widzenia while wykona sie do momentu znalezienia pierwszego boolena czyli pierwszego pasujacego wyrazenia do danego Patternu.

wiec np jak mam "ala bala anna canna" i chce znalezc zaczynajace sie od "a" to while(matcher.find()) znajdzie "ala" i sie skonczy - no chyba ze w j2ee while dziala na innych zasadach

0

[rotfl] ;-)

Dla "<abc>d<fg>" w kolejnych obrotach pętli będzie tak:

  1. find() = true
    group() = "<abc>"
  2. find() = true
    group() = "<fg>"
  3. find() = false

http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28%29

true if, and only if, a subsequence of the input sequence matches this matcher's pattern


Jeżeli użyjesz Pattern.compile("<(.*?)>") i matcher.group(1), to będzie tak:

  1. find() = true
    group(1) = "abc"
  2. find() = true
    group(1) = "fg"
  3. find() = false

To nie jest żadna j2ee. to jest Java Standard Edition (Java SE).
Z resztą nie ma już czegoś takiego, jak j2ee. J2EE zostało zastąpione przez Javę Enterprise Edition (Java EE).

0

ten pattern nie do konca byl dobry - poprawny to "\<(.*?)\>".

jeszcze 1 pytanie i dam wam spokoj ;]

chcialbym te zmienne przerzucic w taglibie i:
jak tworze tagliba w textarea to jest spoko i wszystko dziala

ale jak z kolei chce przerzucic te wartosci do labela badz jako zwykly tekst to nie robi nic. dlugosc znakow zwraca ok, getbytes tez dziala i miejsca poczatkowe i koncowe rowniez. ale jesli chodzi o przerzucenie stringa to jest juz klopot.

z tym whilem to faktycznie dalem ciala :-D (moze dlatego ze ja wszystko na forach i foreachach robie)

Pozdro i sorry za trucie d**y ;]

0

okazalo sie ze przez "<" nie puszcza dalej.

Pozdrawiam i dzieki za pomoc jeszcze raz

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