2015-07-15 19 views
5

Mam plik z niektórych linii w pliku tekstowym jak tenUsuwanie podciągi „dynamicznie” z linii w C#

This is a test value with {MyTestValue = 0.34} How do I delete the test value? My line also has {MySecondTestValue = 0.35} 

Wartość MyTestValue nie jest taka sama wartość w każdej linii.

Czy istnieje sposób określenia liczby znaków do nawiasu zamykającego i usunięcia wszystkiego w nawiasach. Więc moje wyjście byłoby coś takiego:

This is a test value with {} How do I delete the test value? My line also has {MySecondTestValue = 0.35} 
+0

'i usuwania everything'? –

+0

Czy jest otoczony przez '{' i '}'? Podaj przykłady "przed" i "po" –

+1

czy wypróbowałeś wyrażenia regularne? –

Odpowiedz

2
string line="This is a test value with {MyTestValue = 0.34} How do I delete the test value?"; 
int index1=line.indexOf('{'); 
int index2=line.indexOf('}'); 
line=line.Replace(line.Substring(index1,index2-index1),""); 
+0

Myślę, że to powoduje zamieszanie, gdy mój tekst zawiera nawias inny niż MyTestValue. –

+1

Zmień go na 'int index1 = line.indexOf (" {MyTestValue = ")'. Wtedy byłoby to świetne rozwiązanie bez regex. –

3

ewentualnego wdrożenia poprzez wyrażeń regularnych:

String source = "This is a test value with {MyTestValue = 0.34} How do I delete the test value?"; 

String result = Regex.Replace(source, "{.*}", (MatchEvaluator) ((match) => "{}")); 
+0

Miejmy nadzieję, że OP nie ma zagnieżdżonych nawiasów klamrowych ... Ale dobre rozwiązanie i tak –

2

Spróbuj

string output = Regex.Replace(input, @"{MyTestValue = [0-9.]+}", "{}"); 
0

StringBuilder jest najbardziej skuteczny sposób na pracę ze sznurkami. można utworzyć niestandardową metodę, która współpracuje z nim:

static string[] ClearValues(string[] dirtyLines, string[] ignoreValuesList) 
    {    
     string[] result = new string[dirtyLines.Length]; 
     bool ignore = false; StringBuilder s = new StringBuilder(); 
     StringBuilder s2 = new StringBuilder();    

     for (int i = 0; i < dirtyLines.Length; i++) 
     {     
      for (int i2 = 0; i2 < dirtyLines[i].Length; i2++) 
      { 
       if (dirtyLines[i][i2] == '{') { s2.Clear(); s.Append(dirtyLines[i][i2]); ignore = true; continue; } 
       if (dirtyLines[i][i2] == '}') { if(ignoreValuesList.Contains(s2.ToString())) s.Append(s2.ToString()); s.Append(dirtyLines[i][i2]); ignore = false; continue; } 
       if (!ignore) { s.Append(dirtyLines[i][i2]); } else { s2.Append(dirtyLines[i][i2]); }      
      } 
      result[i] = s.ToString(); 
      s.Clear();     
     } 
     return result; 
    } 

Przykład użycia:

static void Main() 
    { 
     string[] dirtyLines = 
     { 
      "This is a test value with {MyTestValue = 0.34} How do I delete the test value?", 
      "This is {SomeOther = 11} How do I delete the test value?", 
      "{X = 134} How do {Y = 500} I delete the {Z = 400}test value?", 
     }; 

     Stopwatch s = new Stopwatch(); 
     s.Start(); 

     string[] clean = ClearValues(dirtyLines, new[] { "Y = 500", "Z = 400" }); 

     s.Stop();    

     for (int i = 0; i < clean.Length; i++) 
     { 
      Console.WriteLine(clean[i]); 
     } 
     Console.WriteLine("\nIt took {0} ms and {1} CPU ticks for method to execute", s.ElapsedMilliseconds, s.ElapsedTicks); 
     Console.ReadKey(); 
    } 

wyjściowy:

enter image description here

+0

Co powiesz na sytuacje, w których input = 'To jest wartość testowa z {MyTestValue = 0.34} Jak usunąć testową wartość? "Moja linia ma również {MySecondTestValue = 0.35}" i potrzebuję wyjścia takiego jak: 'Jest to wartość testowa z {} Jak mogę usunąć testową wartość? Moja linia ma również {MySecondTestValue = 0.35}' –

+0

@MaskedAfrican zaktualizował mój Odpowiedź – Fabjan

+0

Hmm, może to po prostu zrobić, ale w tym przypadku nie wiem, jaka wartość Y i Z jest w każdej linii, Wiem tylko, że chcę zachować te wartości. –