Przeczytałem kilka pytań dotyczących parsowania ciągów według tagów, ale nie znalazłem dokładnej odpowiedzi na mój konkretny problem. Problem: mam duży wiersz tekstu. Muszę przeanalizować ten ciąg na kilka na podstawie tagów. Przykład: znajduję [tag], a następnie czytam tekst do [tag] i przestawiam go na nowy ciąg. Następnie czytam tekst, zanim pojawi się ten sam [tag], i publikuję te dane w nowym ciągu i tak dalej.

Przykład: [tag] Lorem Ipsum [tag] to po prostu fikcyjny tekst z branży poligraficznej i składu. Lorem Ipsum to standardowy fikcyjny tekst w branży już od XVI wieku, kiedy nieznana drukarnia wzięła kambuz z czcionkami i poskładała je, by stworzyć zeszyt z wzorami czcionek. [tag] Przetrwał [tag] nie tylko pięć wieków, ale także skok w kierunku składu elektronicznego, pozostając zasadniczo niezmieniony. Został spopularyzowany w latach 60. wraz z wydaniem arkuszy Letraset zawierających fragmenty Lorem Ipsum, a ostatnio wraz z oprogramowaniem DTP, takim jak Aldus PageMaker, w tym wersjami Lorem Ipsum.

Chcę trzy ciągi oparte na tym tekście: Lorem Ipsum, Ma, tekst między tym

1
artouiros 22 lipiec 2011, 21:57
A czego próbowałeś do tej pory?
 – 
SJuan76
22 lipiec 2011, 21:59

3 odpowiedzi

Najlepsza odpowiedź
String txt = "[tag] Lorem Ipsum [tag] is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. [tag] It has [tag] survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";

int index = -1;
while (true)
{
    int i = txt.indexOf("[tag]", index+1);
    if (i == -1) break;
    if (index == -1)
    {
        index = i;
    } else
    {
        System.out.println(txt.substring(index + 5, i));
        index = i;
    }

}
1
Martijn Courteaux 22 lipiec 2011, 22:08
Dzięki Ci. dokładnie to, czego potrzebuję. Próbowałem bawić się wyrażeniami regularnymi, ale nie mogłem znaleźć sposobu na dotarcie do tekstu między tagami. więc bardzo mi pomagasz.
 – 
artouiros
22 lipiec 2011, 22:29
Przepraszam za kłopot, ale jak mogę umieścić te ciągi w tablicy String[]? Nie chodzi mi o to, żeby je drukować, ale umieścić w tablicy. Próbowałem zrobić pętlę for(), ale myślę, że twój kod jest również pętlą, więc to nie zadziała.
 – 
artouiros
23 lipiec 2011, 08:50
Naprawdę uważam, że to powinno działać test[i] = strin.substring(index + 1, i); ale daje wartość null;
 – 
artouiros
23 lipiec 2011, 08:57

Wyrażenia regularne na ratunek!

LinkedList<String> matches = new LinkedList<String>();
Pattern pattern = Pattern.compile("\\[tag\\].*?\\[tag\\]");
Matcher matcher = pattern.matcher(str);

while(matcher.find())
    matches.add(matcher.group());

Alternatywnie możesz po prostu ręcznie przejść przez ciąg.

int index = -1;

while( str.indexOf("[tag]",index+1) != -1 ) {
    String s = str.substring( index = str.indexOf("[tag]",index+1)+5, index = str.indexOf("[tag]",index) );
    System.out.println(s);
}
1
tskuzzy 22 lipiec 2011, 22:22
Muszę powiedzieć, że nie próbowałeś tego lub nie przeczytałeś do końca pytania... PO chce również tekstu między zamykaniem a otwieraniem tagów: [tag]foo[tag]bar[tag]baz[tag] powinien dać foo , bar, baz
 – 
Martijn Courteaux
22 lipiec 2011, 22:13
1
Napisał: „Lorem Ipsum, ma tekst między tym
 – 
Martijn Courteaux
22 lipiec 2011, 22:29

Użyj metody podziału klasy String. Oczekuje wyrażenia regularnego jako parametru:

String allText = "some[tag]text[tag]separated[tag]by tags";
String[] textBetweenTags = allText.split("\\[tag\\]");
for (int i = 0; i < textBetweenTags.length; i++) {
    System.out.println(textBetweenTags[i]);
}
0
Martijn Courteaux 22 lipiec 2011, 22:30