problemen met characters in string

Status
Niet open voor verdere reacties.

Doomic

Gebruiker
Lid geworden
30 jan 2007
Berichten
96
ik heb een string met als waarde "iets(nogwat"
vervolgens schrijf ik die string naar een txt bestand.
vervolgens lees ik het tekst bestand weer uit. en gaat hij ergens in mn programma op zn plaat met de volgende mededeling: (vrij vertaald) mist afsluitteken: ")"
als ik vervolgens handmatig in het tekstbestandje de string aanpas naar: "iets\(nogwat"
dan is het met uitlezen geen probleem

dus wat moet ik doen:
of bij het wegschrijven een "\" ervoor zetten
of bij het uitlezen een 1 of andere code geven waardoor die het niet erg vind dat er geen haakje-sluit in de string zit.

wat heb ik geprobeerd:
om bij het wegschrijven de substring "(" op te zoeken en te vervangen door "\("
ook al geprobeerd met meerdere "\"-tekens.

ik weet van php of html dat je een code op kan geven die een string uitleest en alle gekke symbolen vervangt met escape charakters.
bestaat dat ook in java?
 
Ok, da's de eerste keer dat ik zoiets hoor in Java. En het is eigenlijk ook echt wel een zeer vreemde foutmelding. Java wordt gecompileerd voor uitvoering, dus ingelezen tekst wordt nooit als code geïnterpreteerd. Php daarentegen gaat door een interpreter, waardoor dat wel problemen kan geven.

Kunt ge misschien eens iets meer informatie geven? Welke code gebruikt ge om die file in te lezen?

Ik heb zelf even vlug een testje gemaakt, en zoals ik verwachte heeft Java geen enkel probleem met haakje, dus misschien helpt het als je wat meer uitleg geeft. Ik ben ook wel gewoon nieuwsgierig om te weten welke methode daar problemen zou mee hebben.
 
ja dat verhaal wat jij zegt dacht ik ook. maargoed. blijkbaar is er toch iets mis.

hier de error melding:
Code:
run:
Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Unclosed group near index 17
Hotmail (m_ b53\
                           ^

het volgende staat in een tekstbestandje:
Code:
Hotmail (m_ b53\&/test\

die lees ik in in een string array "replace"
en vervolgens splits ik de tekst op de "&/"
Code:
for(int b=0; b<replace.length ;b=b+1) var[x] = var[x].replaceAll(replace[b].split("&/")[0], replace[b].split("&/")[1]);

ik heb al via de debugger gevonden dat die op die spit vast loopt.



ik heb de laatste regel nog verder uit gepluisd:
Code:
String t1 = replace[b].split("&/")[0];
String t2 = replace[b].split("&/")[1];
try{var[x] = var[x].replaceAll(t1, t2);}
catch(Exception e){}

t1 = "Hotmail (m_ b53\\"
t2 = "test\\"
var[x] = "\\Hotmail (m_ b53\\ff\\7ED72C1D-0000000B.eml"

en ik wil dat de string var[x] wordt:
var[x] = "\\test\\ff\\7ED72C1D-0000000B.eml"

nu geeft die geen foutmelding meer maar gaat die telkens naar de "catch" dus hij vertikt het nogsteeds om te doen



even voor de duidelijkheid:
het is een programma dat emails synchroniseerd tussen 2 computers. alleen het probleem is dat de ene computer een andere mapnaam heeft om de mails in op te slaan dan de andere computer (ondanks dat het het zelfde account is) dus vandaar de replace gedeelte.
 
Laatst bewerkt:
Er wordt niet louter een string verwacht, er wordt een regular expression (als string) verwacht. Wat je ingeeft moet dus voldoen aan een bepaalde syntax. Zonder in detail te gaan - zou zelf moeten zoeken - is het perfect OK als je die &/ escaped, dus met \&\/. Dan wordt er letterlijk naar gezocht. Zie google voor meer info over regex ;).
 
nee is geen probleem om iets ander daar neer te zetten.
maar hij blijft niet hangen op de split.

maar hij blijft op replace hangen..
dus het vervangen van :
t1 = "Hotmail (m_ b53\\"
door:
t2 = "test\\"

in de string:
var[x] = "\\Hotmail (m_ b53\\ff\\7ED72C1D-0000000B.eml"

Code:
var[x] = var[x].replaceAll(t1, t2);
 
Laatst bewerkt:
Mja, beetje verwarrend - in je post stond er 'ik heb al via de debugger gevonden dat die op die split vast loopt' maar het wordt pas daarna uitgesplitst :).

Enfin, de fout is dezelfde. Je wil "Hotmail (m_ b53\\" gebruiken als regex en daar begin je inderdaad een groep (haakje) zonder die te sluiten. Je regex is ongeldig en dus wordt er een exception geworpen.

Heb je niet gewoon de methode replace() ipv replaceAll() van String nodig?
 
mm had geen mail meer gehad dat er gereageerd was. maargoed:

bedankt voor de reacties.
replaceAll() verwacht idd 2 argumenten.

Code:
var[x] = var[x].replaceAll(t1, t2);

lijkt me dus wel goed.

en ja er bestaat iets als replace() alleen slikt die een char ipv een string
maar het gekke is dat replaceAll normaal wel werkt alleen door dat haakje open niet meer.

als ik voor dat haakje over een backslash zet dan is het probleem opgelost, alleen zit ik dan weer met andere problemen.
 
Het helpt als je erbij zet welke versie van Java je gebruikt ;). Tenzij anders aangegeven verwacht ik Java 6, waar je volgende methode hebt bij String:
Code:
replace(CharSequence target, CharSequence replacement)
          Replaces each substring of this string that matches the literal target sequence with 
          the specified literal replacement sequence.

Enfin, replaceAll dus.

het gekke is dat replaceAll normaal wel werkt alleen door dat haakje open niet meer
We zeiden het al met twee, dat komt doordat replaceAll werkt met reguliere expressies :).

Bekijk even het volgende stukje code:
Code:
		String test = "\\Hotmail (m_ b53\\ff\\7ED72C1D-0000000B.eml";
		String t1 = "Hotmail \\(m_ b53\\\\";
		String t2 = "test\\\\";
		
		System.out.println("string: " + test);
		System.out.println("regex: " + t1);
		System.out.println("te vervangen door: " + t2);
		System.out.println("string na replace: " + test.replaceAll(t1, t2));

met dit als uitvoer:
Code:
string: \Hotmail (m_ b53\ff\7ED72C1D-0000000B.eml
regex: Hotmail \(m_ b53\\
te vervangen door: test\\
string na replace: \test\ff\7ED72C1D-0000000B.eml

Waarom werkt dit?
1) je weet al dat je elke backslash die je in een string wil moet escapen, \ wordt \\
2) je weet ook al dat je in een reguliere expressie alle speciale tekens moet escapen met een backslash (wat een dubbele backslash wordt!). Wil je in je reguliere expressie dus je backslash ('\\') escapen, dan wordt dat '\\\\'. De speciale tekens die in dit voorbeeld voorkomen zijn een haakje, waarmee je normaal een groep zou starten, en een backslash.
3) óók de string waarmee je vervangt is een reguliere expressie, dus de backslash moet opnieuw escaped worden: \\\\

Post gerust als je er niet meteen aan uit raakt.
 
Laatst bewerkt:
ik heb het nu met replace geprobeerd en het werkt.
dacht dat ik het al geprobeerd had en dat het niet werkte. dacht ook dat char 1 karakter betekende... maar was dus gewoon een string.
nouja. weet nu in ieder geval wel wat reguliere expressies precies betekend.

hartstike bedankt voor de hulp. en het geduld.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan