[C#/Regex] Regex.Replace; originele waarde & lege regel?

Pagina: 1
Acties:
  • 815 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-09 12:03
Ik ben vrij nieuw met het RegEx gebeuren, maar ik weet wel dat er heel veel mee mogelijk is. Ondertussen heb ik al een aantal keer correct een Regex kunnen gebruiken, maar de volgende 2 situaties kom ik zelf toch niet uit.

Startsituatie:
Ik lees in C# een tekstbestand in in een List van Strings, 1 regel is 1 string. Middels een foreach loop stap ik door alle regels heen. Op elke regel voer ik een Regex.Replace commando uit, en de returnwaarde schrijf ik in een andere List van Strings (de writelist).

Probleem 1:
Alleen is er 1 uitzonderingsituatie waarbij de Regex.Replace een lege regel teruggeeft (en dus de writelist een lege string bevat). Is er een manier waarbij ik de bestaande regel kan verwijderen, zonder dat ik er een lege string aan overhoud? (Dus dat de writelist bij een .Add commando niets doet adden?) Of op een andere manier door de hele List kan loopen? In eerste instantie wilde ik de orignele readlist wijzigen, maar omdat ik in een foreach loopje zit kan ik de originele waarde niet wijzigen omdat ik daarmee ook enumereer. Is de enige oplossing hiervoor een normale for loop gebruiken? Of is er een Regex commando wat ik over het hoofd zie?

Probleem 2:
Ik wil een regel toevoegen na een bestaande regel in een bestand, alleen de originele regel moet ik wel behouden met de Replace. Middels het patroon .*Regel1.* match ik de hele regel. En na deze specifieke regel moet ik dus een nieuwe toevoegen. Is er een manier om in het replacepattern de originele waarde niet te overschrijven? Of om de originele waarde mee te nemen in de replace? Als ik namelijk .*Regel1.*\nNieuweRegel\n gebruik in mijn replacepattern, dan schrijft C# letterlijk die tekst, maar niet de originele bestaande regel. (Ik kan niet de gehele regel meegeven in het replacepattroon omdat er ook nog variabele info instaat).
Voorbeeld:
Regel1VasteTekstVariabeleTekst
Regel2VasteTekstVariabeleTekst

zou na de regex dan:
Regel1VasteTekstVariabeleTekst
ToegevoegdeRegel
Regel2VasteTekstVariabeleTekst

moeten worden, alleen dat lukt dus niet. Voorlopig heb ik een workaround gemaakt met C# die de complete originele regel incl. de variabele tekst in een string schrijft, maar ik vermoed dat dit ook met Regex zelf moet kunnen, zodat het meteen een stuk netter is.

Bedankt alvast voor degene die me kan helpen :)

Wanna play?


Acties:
  • 0 Henk 'm!

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 25-08 15:44
Probleem 1:
Laat wat code zien?

Probleem 2:
Als ik het goed begrijp wil je dus gewoon een nieuwe string maken.
zoek je waarden op met een de Find() en build dan gewoon een nieuwe string met een string.Format()

Laat iig wat code zien...

Windows Phone Apps: Belstatus, Pinautomaten


Acties:
  • 0 Henk 'm!

Verwijderd

probleem 1:
string.isnullorempty eerst doen? voor je add dus

probleem 2:
je zou als hij het pattern matcht toch een extra regel kunnen adden middels add?

Acties:
  • 0 Henk 'm!

  • cspare
  • Registratie: Oktober 2006
  • Laatst online: 29-07 22:19

cspare

What the deuce?!

kun je hier niet wat mee voor probleem 2? eerste hit in google.

The one who says it cannot be done, should never interrupt the one who is doing it.


Acties:
  • 0 Henk 'm!

  • F-Tim
  • Registratie: November 2003
  • Laatst online: 14-09 12:03
Piels schreef op woensdag 19 december 2007 @ 12:51:
Probleem 1:
Laat wat code zien?

Probleem 2:
Als ik het goed begrijp wil je dus gewoon een nieuwe string maken.
zoek je waarden op met een de Find() en build dan gewoon een nieuwe string met een string.Format()

Laat iig wat code zien...
Verwijderd schreef op woensdag 19 december 2007 @ 12:56:
probleem 1:
string.isnullorempty eerst doen? voor je add dus

probleem 2:
je zou als hij het pattern matcht toch een extra regel kunnen adden middels add?
Hier is wat code... (ChangeType is een enum, en afhankelijk van de enum bepaal ik het gekozen pattern en het replacepattern. Zoals je ziet gebruik ik de uitvoerwaarde van die regex direct als invoerwaarde in de .Add. Een string.isnulloremtpy kan ik dus niet doen. Heb er nog ff aan gedacht om een inline-if toe te passen, maar deze krijg ik ook niet goed werkend (het else commando is dan namelijk 'doe niks', en daar klapt VS op vast, ook als ik het else commando gewoon weglaat).

Probleem 2 met String.Find en String.Format oplossen is niet met het gebruik van RegEx he? :) Ik wil het juist met RegEx doen om alles in 1 regel code te kunnen proppen (en omdat ik dan 1 generieke functie change functie kan gebruiken waarbij ik 3 parameters heb, oude waarde, nieuwe waarde, en het te wijzigen veld)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
String Pattern = "";
String ReplacePattern = "";
switch (Type)
{
   case ChangeType.A: //Gedeelte van Old voor : vervangen door nieuwe waarde
      Pattern = "\\B(, \"" + Old.Substring(0, Old.IndexOf(":")) + "\"\\);)+";
      ReplacePattern = ", \"" + NewValue.Substring(0, NewValue.IndexOf(":")) + "\");";
      break;
   case ChangeType.B: //Gedeelte van Old na : vervangen door nieuwe waarde
      Pattern = "\\B(, " + Old.Substring(Old.IndexOf(":") + 1) + ")+";
      ReplacePattern = ", " + NewValue.Substring(NewValue.IndexOf(":") + 1) + ");";
      break;
   case ChangeType.C: //Regel wissen (incl. variabele waarden dankzij .*
      Pattern = ".*Vaste_Waarde.*";
      ReplacePattern = String.Empty;
      break;
   case ChangeType.D: //Regel toevoegen na de huidige regel, ReplacePattern klopt niet
      Pattern = ".*Vaste_Waarde*";
      ReplacePattern = "VasteWaarde\": " + New.Substring(New.IndexOf(":") + 1) + "ExtraTekst";
      break;
}

foreach (String Line in ReadList)
{
   WriteList.Add(Regex.Replace(Line, Pattern, ReplacePattern));
}
cspare schreef op woensdag 19 december 2007 @ 13:15:
kun je hier niet wat mee voor probleem 2? eerste hit in google.
Hier kan ik volgens mij heel veel mee! Vreemd genoeg heb ik wel op KnowDotNet gekeken, maar heb ik die subpagina niet gevonden 8)7. Ik ga meteen experimenteren, maar volgens mij kan ik met die commando's exact doen wat ik wil bij probleem 2!

_/-\o_ Hartstikke bedankt! M'n 2de probleem is bij deze officieel opgelost! Hoe simpel kan het soms zijn.

Wanna play?