Gå til innhold

Ta vare på token ved String-splitting


Anbefalte innlegg

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 av Gavekort
Lenke til kommentar
Videoannonse
Annonse

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

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 av etse
Lenke til kommentar

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. :p

 

sentences = currentWordline.split("[\\.\\!\\?]+[[^ ] \\.|\\!|\\?]");

Lenke til kommentar

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!

  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...