Gavekort Skrevet 13. oktober 2012 Del Skrevet 13. oktober 2012 (endret) Hei! Jeg skal splitte en String ved punktum, utropstegn eller spørsmålstegn, problemet er at split fjerner tokenet før den putter det i et array. String[] sentences = null; currentWordline = br.readLine(); sentences = currentWordline.split("\\.|\\?|\\!"); Så om br.readLine() gir: meat prepared from a pig. Bacon is tasty. Så vil arrayet se slik ut: [meat prepared from a pig][bacon is tasty] //Uten punktum bak "pig" eller "tasty" Hvordan kan jeg bruke regexp til å ta vare på token, eller hvordan kan jeg jobbe rundt dette problemet uten for mye tull? Endret 13. oktober 2012 av Gavekort Lenke til kommentar
jonny Skrevet 13. oktober 2012 Del Skrevet 13. oktober 2012 Noe sånt: public static String[] split(String text, char... delimiters) { java.util.List<String> result = new java.util.LinkedList<>(); int nextSplitPos; int curPos = 0; do { nextSplitPos = text.length(); for (int i = 0; i < delimiters.length; i++) { int pos = text.indexOf(delimiters[i], curPos); if (pos >= curPos && pos < nextSplitPos) { nextSplitPos = pos; } } result.add(text.substring(curPos, nextSplitPos+1)); curPos = nextSplitPos+1; } while (curPos < text.length()); return result.toArray(new String[result.size()]); } String[] splitted = split("meat prepared from a pig. Bacon is tasty.", '.', '!', '?'); Lenke til kommentar
etse Skrevet 13. oktober 2012 Del Skrevet 13. oktober 2012 (endret) Nå er ikke jeg noe mester i regexp enda, har såvidt brukt det. Men hørtes ut som det du ønsker. Nå teste jeg bare i python, men kom frem til noe så stygt som dette her som burde funke: expression = "[^ ][^\.\!\?]+[\.|\!|\?]" Python eksempel for å vise hva den gir til svar, burde være lett å skrive om til Java >>> a = "Et setning. Enda et setning. Her roper jeg litt! Roper litt mer! Liker du kake? Er Bacon godt? REGEXP!" >>> re.findall("[^ ][^\.\!\?]+[\.|\!|\?]", a) ['Et setning.', 'Enda et setning.', 'Her roper jeg litt!', 'Roper litt mer!', 'Liker du kake?', 'Er Bacon godt?', 'REGEXP!'] Endret 13. oktober 2012 av etse Lenke til kommentar
Gavekort Skrevet 13. oktober 2012 Forfatter Del Skrevet 13. oktober 2012 Noe sånt: public static String[] split(String text, char... delimiters) { java.util.List<String> result = new java.util.LinkedList<>(); int nextSplitPos; int curPos = 0; do { nextSplitPos = text.length(); for (int i = 0; i < delimiters.length; i++) { int pos = text.indexOf(delimiters[i], curPos); if (pos >= curPos && pos < nextSplitPos) { nextSplitPos = pos; } } result.add(text.substring(curPos, nextSplitPos+1)); curPos = nextSplitPos+1; } while (curPos < text.length()); return result.toArray(new String[result.size()]); } String[] splitted = split("meat prepared from a pig. Bacon is tasty.", '.', '!', '?'); Det kunne fungert som en alternativ metode, men jeg må prøve å holde det simpelt og etter oppgaven, slik at jeg ikke vandrer så mye rundt når jeg skal evt. skal levere oppgave med lik algoritme. Nå er ikke jeg noe mester i regexp enda, har såvidt brukt det. Men hørtes ut som det du ønsker. Nå teste jeg bare i python, men kom frem til noe så stygt som dette her som burde funke: expression = "[^ ][^\.\!\?]+[\.|\!|\?]" Python eksempel for å vise hva den gir til svar, burde være lett å skrive om til Java >>> a = "Et setning. Enda et setning. Her roper jeg litt! Roper litt mer! Liker du kake? Er Bacon godt? REGEXP!" >>> re.findall("[^ ][^\.\!\?]+[\.|\!|\?]", a) ['Et setning.', 'Enda et setning.', 'Her roper jeg litt!', 'Roper litt mer!', 'Liker du kake?', 'Er Bacon godt?', 'REGEXP!'] Det høres riktig ut, men Java er litt mer picky enn som så. Men jeg prøvde meg frem, og fant en regexp basert på din, som fungerer, selv om jeg ikke helt vet hva som skjer. sentences = currentWordline.split("[\\.\\!\\?]+[[^ ] \\.|\\!|\\?]"); Lenke til kommentar
jonny Skrevet 13. oktober 2012 Del Skrevet 13. oktober 2012 Hmmm... det regex-uttrykket fungerer akkurat som String.split() når jeg tester det... alle punktum, spørsmålstegn og utropstegn blir fjernet. Lenke til kommentar
etse Skrevet 13. oktober 2012 Del Skrevet 13. oktober 2012 Hmmm... det regex-uttrykket fungerer akkurat som String.split() når jeg tester det... alle punktum, spørsmålstegn og utropstegn blir fjernet. utrykket hans er og litt feil, og han skal ikke bruker det direkte i split slik han gjør så ikke rart det ikke funker, han skulle brukt "Pattern", og utrykket jeg kan han over. (bare lagt til double slashed, i stede for enkle siden man må escape \ i java= Da ender man opp som en kode som dette: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main( String args[] ) { // String to be scanned to find the pattern. String line = "Et setning. Enda et setning. Her roper jeg litt! Roper litt mer! Liker du kake? Er Bacon godt? REGEXP!"; String pattern = "[^ ][^\\.\\!\\?]+[\\.|\\!|\\?]"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. Matcher m = r.matcher(line); while (m.find( )) { System.out.println("Found value: " + m.group() ); } } } som skal gi følgende output $ java Test Found value: Et setning. Found value: Enda et setning. Found value: Her roper jeg litt! Found value: Roper litt mer! Found value: Liker du kake? Found value: Er Bacon godt? Found value: REGEXP! 1 Lenke til kommentar
Gavekort Skrevet 14. oktober 2012 Forfatter Del Skrevet 14. oktober 2012 Tusen takk. Skal se på det så snart jeg orker å dra frem oppgaven igjen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå