Avatar billede pondo Nybegynder
08. august 2007 - 07:43 Der er 3 kommentarer og
1 løsning

Java: "Klippe" text dele ud af text

Hejsa,

Jeg er lidt mere end begynder i java, og arbejder på et program der hurtigt skal kunne vise informationer fra en html side...

Jeg har fået indlæst url så den kan skrives til en string/tekstfil og vises som html doc i JEditorPane.

MEN jeg skal så kunne gemme visse dele af html koden i strings til hurtigt visning, eks:
...->
<h5>Plot Outline:</h5>
Professional assassin Leon reluctantly takes care of 12-year-old Mathilda, a neighbor whose parents are killed, and teaches her his trade. <a class="tn15more inline" href="...<-

dette er en del af koden fra html dokumentet, her vil jeg klippe den del ud med beskrivelsen til en string.

Kan jeg evt bruge StringTokenizer og dele string'en op med en tegn kombination som </h5> eller kan man kun dele med enkelte tegn ?
Avatar billede mikkelbm Nybegynder
08. august 2007 - 07:51 #1
String har en split metode, men jeg vil nok anbefale, at du prøver noget med regulære udtryk. Jeg tror det bliver noget rod, at skulle sidde og klippe/klistre selv med String.split eller StringTokenizer.

Jeg er desværre ikke så skarp i regulære udtryk, at jeg vil prøve at belære dig omkring det, men jeg er sikker på, at der er andre herinde der kan. Prøv eventuelt at oprette et lignende spørgsmål i regex kategorien. (Henvis eventuelt til denne tråd)
Avatar billede nielle Nybegynder
08. august 2007 - 08:29 #2
Skitsen til en løsning med regexp kunne f.eks. se sådan her ud:

String text = "...-><h5>Plot Outline:</h5> Professional assassin Leon reluctantly takes care of 12-year-old Mathilda, a neighbor whose parents are killed, and teaches her his trade. <a class=\"tn15more inline\" href=\"...<-";
       
System.out.print("\nFør:  " + text);
       
text = text.replaceAll(".*?</h5>\\s*([^<]*?)\\s*<.*", "$1");
       
System.out.print("\nEfter: " + text);
Avatar billede pondo Nybegynder
08. august 2007 - 08:46 #3
nielle,

Det var bare perfekt det du kom med der!
Gider du fortælle mig hvordan i alverden den fandt ud af det ud fra:
text.replaceAll(".*?</h5>\\s*([^<]*?)\\s*<.*", "$1");

Hvad betyder alle de tegn, kan ikke rigtig gennemskue hvad jeg kan/må ændre til udvælgelse af de næste brustykker der vil være inddelt med andre tegnkombi:
f.eks :
</h5> til <a
og smid det lige i et svar så du kan få point. og takker for indsatsen til jer begge
Avatar billede nielle Nybegynder
08. august 2007 - 09:30 #4
Mønsteret består af forskellige del-elementer, en pr. linje nedenfor:

.*?
</h5>
\\s*
([^<]*?)
\\s*
<
.*

(o) . - matcher "et vilkårligt tegn".

(o) * - betyder "nul eller flere ...". Derfor vil .* matche "nul eller flere tegn".

(o) ? - Normalt er * "grådig" (engelsk: greedy) dvs. at den tager så meget som den kan komme til. I værste tilfælde ville .* derfor matche hele strengen. Dette er et problem, hvis vi vil have fat i en del af strengen (som her). ?-tegnet ændre adfærden fra "grådig" til "doven" (engelsk: lazy) sådan at .*? i stedet for at matche så meget det kan, kun matcher det absolutte minimum.

(o) </h5> - matcher teksten "</h5>". Dvs. at ".*?</h5>" matcher denne del af din input-streng:

"...-><h5>Plot Outline:</h5>"

(o) \s - matcher "et whitespace tegn". Dette kunne f.eks. være et mellemrum, men det er linjeskift og tabulatortegn. Da \-tegnet her en speciel betydning i en java-streng, skal den escapes: \\s. Men dette er altså mere en java-problemstilling end en regexp-ditto.

(o) \s* - matcher "nul eller flere whitespace tegn". Grunden til at denne er med, er for at slippe for eventuelle mellemrum i starten af det vi ønsker at finde. Hvis input-teksten ser sådan her ud:

"...-><h5>Plot Outline:</h5> Professional assassin ..."

vil ".*?</h5>\\s*" matche denne del:

"...-><h5>Plot Outline:</h5> "

Hvis det altid er sikkert at der er præcist et mellemrum, kunne man have undværet *-tegnet.

(o) (...) - Nu er vi så nået frem til den del at input-strengen vi ønsker at udtrække. For at markere at vi nu kommer til noget vi ønsker at huske placeres dette i et ()-par.

(o) Det der matches af ()-parret bliver gemt under navnet "$1" og det er det som bliver brugt som 2. parameter i:

text = text.replaceAll(..., "$1");

Havde der været flere sådanne ()-par ville de hedde $2, $3 osv.

(o) [^<]*? - Inde i parentesen har vi så den del som matcher netop det der skal udtrækkes:

(o) [^...] - matcher "et vilkårligt tegn som ikke er ...".

(o) [^<] - matcher derfor "et vilkårligt tegn som ikke er '<'". Et andet eksempel kunne være [^abc] som matcher "et vilkårligt tegn som ikke er 'a', 'b' eller 'c'".

(o) [^<]*? - matcher dermed "nul eller flere vilkårligt tegn som ikke er '<'" og ?-tegnet gør matchningen "doven".

(o) Havde ?-tegnet ikke været der ville det i parentesen matche:

"Professional assassin Leon reluctantly takes care of 12-year-old Mathilda, a neighbor whose parents are killed, and teaches her his trade. "

altså inklusiv det afsluttende mellemrum.

(o) \s* - sørger dog for [^<]*? godt kan få lov til at undlade mellemrummet; hvis den blot matcher den første del:

"Professional assassin Leon reluctantly takes care of 12-year-old Mathilda, a neighbor whose parents are killed, and teaches her his trade."

vil \s* matche den sidste del.

(o) < - matcher et '<' tegn.

(o) .* - matcher "nul eller flere vilkårlige tegn", dvs. resten af strengen.

Håber at det forklarede sagen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester