webForumDet fria alternativet
Logga in / Bli medlem

Problem med StreamTokenizer

Java

3 svar · 235 visningar · startad av BABBA

Medlem sedan feb. 2000280 inlägg
Frågan#1

Jag vill parsa en text som innehåller skräptecken och bara plucka ut orden. Min textfil ser ut så här:
---- test.txt ----
!Three!!?(words" '133+ 4real!]
,:words??
-------------------

Min java-kod:

import java.io.*;

public class  Tokenizer  
{
	public static void main(String args[] ) throws Exception
	{
		Reader r = new BufferedReader(new FileReader("test.txt"));

		StreamTokenizer parser = new StreamTokenizer(r);
		
		parser.lowerCaseMode(true);

		parser.eolIsSignificant(true);	
	
		while ( parser.nextToken() != StreamTokenizer.TT_EOF )
		{
			if ( parser.ttype == StreamTokenizer.TT_WORD)
				System.out.println(parser.sval +" "+ parser.ttype);
		} 
	}
}

Det som skrivs ut är:
three
words
words

alltså inte "real". Varför inte då?? Jag behöver verkligen hjälp med det här! Tack på förhand!

Medlem sedan apr. 20007 588 inlägg
#2

Problemet är att StreamTokenizern kommer att tolka 133+ 4real!] som en sträng, antar jag, eftersom denna ordföljd börjar med en ".

En lösning som funkar är att tala om för Tokenizern att ' och " skall tolkas som vanliga tecken med ordinaryChar()-metoden, lägg till det före while-loopen:

	parser.ordinaryChar('\'');
	parser.ordinaryChar('\"');
Medlem sedan feb. 2000280 inlägg
#3

Tack sgtpepper! Kunglig lösning...

Medlem sedan apr. 20007 588 inlägg
#4

Varsågod :).

Jag ser att wF plockade bort backslash:en från första ordinaryChar()-metoden för enkelfnutt, fast det har du väl antagligen redan fixat, men hursomhelst så måste även enkelfnutt "escape:as":

parser.ordinaryChar('[b]\[/b]'');
258 ms totalt · 4 externa anrop · v20260731065814-full.5386d3bf
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)