[Java] ReplaceAll problemen

Pagina: 1
Acties:

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik wil aan de hand van een template file bepaalde bestanden genereren. Dit doe ik door bepaalde strings (van de vorm: ~~~Zoekterm~~~) te vervangen met iets anders dat uit een XML file komt. Ik gebruik hiervoor de replaceAll functie. Deze functie wordt als volgt beschreven:
public String replaceAll(String regex, String replacement)


Replaces each substring of this string that matches the given regular expression with the given replacement.

An invocation of this method of the form str.replaceAll(regex, repl) yields exactly the same result as the expression


Pattern.compile(regex).matcher(str).replaceAll(repl)
Op zich is er niets mis behalve als er een "$" in de replacement value staat. Dit vind ik persoonlijk heel vreemd, want zoals ik het zie is de replacement string een String en geen regular expression. Dus zou het "$" teken niets moeten uitmaken (in regular expressions heeft het echter wel een speciale betekenis). Maar toch krijg ik een "java.lang.IllegalArgumentException: Illegal group reference" error.

Ik wil graag weten hoe dit komt en wat ik er aan kan doen? Dat stomme "$" teken is namelijk niets iets dat ik weg kan laten...

[ Voor 3% gewijzigd door Deddiekoel op 16-09-2004 11:15 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Niet echt antwoord op je vraag, maar wel interessant voor je:
http://jakarta.apache.org/velocity

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:49

Janoz

Moderator Devschuur®

!litemod

Dat stomme $ teken is voor backreferences. Hiermee kun je bepaalde stukken uit je pattern weer gebruiken in je replacement. $0 is het geheel, $1 is de eerste () enz. Wil je echter gewoon een $ gebruiken dan zul je die moeten escapen. \\$ zal een stuk beter werken. (let op de dubbele \ omdat je de \ zelf ook moet escapen ;) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 21-05 22:50
Nog iets verder kijken in de documentatie:
public String Matcher.replaceAll(String replacement)

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string. Dollar signs may be treated as references to captured subsequences as described above, and backslashes are used to escape literal characters in the replacement string.

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ok, maar hoe kan ik er dan voor zorgen dat de replacement string (die uit een textdocument komt) wordt voorzien van escape characters?

Ik zit nu zelf te denken aan het opsplitsen van de string op de plaats van de $ en die twee stukken weer aan elkaar te zetten met een \\ ertussen....

Dat moet toch makkelijker kunnen? Ook omdat dit niet zal werken als er meerdere $ tekens in staan...
code:
1
subject = subject.replaceAll("[$]", "\\$");

Werkt iig niet...

[ Voor 65% gewijzigd door Deddiekoel op 16-09-2004 11:33 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Ik zou de tip van Alarmnummer volgen. Velocity lijkt me iets geschikter voor dit soort dingen.

With the light in our eyes, it's hard to see.


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Bobco schreef op 16 september 2004 @ 12:35:
Ik zou de tip van Alarmnummer volgen. Velocity lijkt me iets geschikter voor dit soort dingen.
Velocity lijkt me ook erg interessant, maar is toch misschien te omslachtig voor hetgeen ik wil doen... Kan het echt niet simpeler?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Deddiekoel schreef op 16 september 2004 @ 12:57:
[...]

Velocity lijkt me ook erg interessant, maar is toch misschien te omslachtig voor hetgeen ik wil doen... Kan het echt niet simpeler?
Velocity is echt super simpel om te gebruiken :) Check de manual maar eens..

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

$ heeft natuurlijk ook een speciale betekenis in de regular expression zelf, net als [ en ] overigens... Als je de letterlijke string [$] wilt vervangen door $ dan zal je zoiets als regexp's moeten hebben:

"\\[\$\]" door \$ (en de \ dus weer escapen met een extra \)

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Hmmm, ik heb even vlug naar Velocity gekeken maar ik vrees dat ik die ook niet kan gebruiken. Van wat ik heb gezien werkt Velocity met variabelen in de text die worden aangegeven met "$variabelenaam". Nu weet ik dat het template bestand dat ik gebruik ook een dergelijke manier bevat om bepaalde variabelen aan te geven. De twee kunnen elkaar kruisen en dat risico kan ik ECHT niet lopen...
Is deze angst gegrond?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Huh? Je hoefde toch alleen maar dingen van de vorm '~~~Zoekterm~~~' te vervangen? Het is uiteraard nooit handig om twee verschillende notatiesystemen door elkaar heen te gebruiken, maar je zult gewoon een keuze moeten maken tussen of het gebruiken van refex of een template engine a la Velocity.

Hetzelfde soort functionaliteit heb ik ook wel eens gebouwd. Ik heb toen een class geschreven die mbv SAX een Properties object maakt met daarin de waarden van de XML nodes die in een template moeten worden ingevuld. Vervolgens voer ik Velocity dat Properties object en een template gebaseerd op een RTF file en aan het einde van het hele verhaal heb ik een RTF file waarin bepaalde variabele gedeelten netjes zijn ingevuld. Werkt als een speer.

With the light in our eyes, it's hard to see.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 22:28

crisp

Devver

Pixelated

ACM schreef op 16 september 2004 @ 13:45:
$ heeft natuurlijk ook een speciale betekenis in de regular expression zelf, net als [ en ] overigens... Als je de letterlijke string [$] wilt vervangen door $ dan zal je zoiets als regexp's moeten hebben:

"\\[\$\]" door \$ (en de \ dus weer escapen met een extra \)
nee, binnen een character-class heeft de $ geen speciale betekenis en hoeft dan ook niet escaped te worden ;)
TS gebruikt [$] als een character-class met daarin een dollarteken; dat kan gewoon hoewel het onzinnig is een character-class te gebruiken voor slechts 1 teken

[ Voor 16% gewijzigd door crisp op 17-09-2004 11:19 ]

Intentionally left blank


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Bobco schreef op 17 september 2004 @ 08:19:
Huh? Je hoefde toch alleen maar dingen van de vorm '~~~Zoekterm~~~' te vervangen? Het is uiteraard nooit handig om twee verschillende notatiesystemen door elkaar heen te gebruiken, maar je zult gewoon een keuze moeten maken tussen of het gebruiken van refex of een template engine a la Velocity.
Ik wil gewoon die "~~~Zoekterm~~~" vervangen met een waarde waar een $ in kan zitten. Maar dat wil dus niet werken. Dus hoe zorg ik ervoor dat de vervangwaarde met 1 of meerdere $ tekens erin toch gebruikt kan worden als vervanging...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2

Pagina: 1