Autor |
Beitrag |
mannyk
      
Beiträge: 83
Erhaltene Danke: 1
|
Verfasst: Di 24.03.09 12:22
Hiho,
ich möchte gerne einen teil eines textes ersetzten und die backreference in einer variablen speichern
C#-Quelltext 1: 2:
| str = Regex.Replace(str, "..(\\d)..", "", RegexOptions.None); string id = $1; |
Hier ist das Resultat, dass in id nachher immer $1 steht, nicht aber das Ergebis vom Ersetzen.
Ausserdem weiss ich nicht wie oft gematcht wird. Besser wäre also, wenn die IDs in ein Array gelesen werden.
Danke und lg,
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 24.03.09 15:06
Nun, dann musst du eben vor dem Replace noch ein Regex.Matches mit dem gleichen Ausdruck abschicken  .
_________________ >λ=
|
|
mannyk 
      
Beiträge: 83
Erhaltene Danke: 1
|
Verfasst: Di 24.03.09 16:42
Danke, so in der Art hab ich mir das auch schon gedacht.
Dann weiss ich wie oft ein Matching stattgefunden hat.
Wie kann ich aber auf die Werte von den Matchings (der Inhalt der runden Klammer) zugreifen und in ein Array schreiben?
Da stehe ich einfach an.
LG,
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 24.03.09 18:20
$1 verweist auf die Gruppe #1 im Regex. Der gesamte Match ist Gruppe 0, der vom ersten Klammernpaar gematchte Teil Gruppe 1 usw.
Im Code kommst du an die Gruppen über Match.Groups.
_________________ >λ=
|
|
mannyk 
      
Beiträge: 83
Erhaltene Danke: 1
|
Verfasst: Mi 25.03.09 09:18
Danke für den Tipp,
das bringt mich leider aber nicht weiter, da ich in Match.Group kein Member gefunden habe, dass mir den Wert hält. Lediglich den gesamten String im value Objekt. Ich möchte aber NUR den Zahlenwert.
In Perl und Java ist das so einfach ;(
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 25.03.09 09:36
Hm? Zeig mal bitte deinen Code, Groups[1].Value sollte eigentlich nur den Match von \d enthalten.
_________________ >λ=
|
|
mannyk 
      
Beiträge: 83
Erhaltene Danke: 1
|
Verfasst: Mi 25.03.09 09:40
Was ich auch nicht verstehe: Ich sollte in dem String (in verschiedenen Zeilen) mehrere Matchings haben.
Match.Captures.Count ist jedoch immer 1.
C#-Quelltext 1: 2:
| match = Regex.Match(sourceCode, "MODULE id=\"(\\d*?)\"", RegexOptions.Singleline); for (int i = 0; i < match.Captures.Count; i++) |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 25.03.09 09:45
Match.Captures ist eigentlich sinnlos und existiert nur, weil die Klasse von Group abgeleitet ist. Für mehrere Matches des gesamten Regex brauchst du, wie ich schrob, Regex.Matches.
_________________ >λ=
|
|
mannyk 
      
Beiträge: 83
Erhaltene Danke: 1
|
Verfasst: Mi 25.03.09 09:59
Sorry, das habe ich dann falsch verstanden.
Um auf weitere Matchings zuzugreifen, kann man auch folgendes machen, wie ich gesehen habe.
C#-Quelltext 1: 2: 3: 4: 5:
| while (match.Success) { ... match = match.NextMatch(); } |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 25.03.09 13:35
Jupp, das geht auch. Aber da du ja die Matches auch zählen willst, halte ich Regex.Matches für geschickter. Ein großer Unterschied ist es natürlich nicht  .
_________________ >λ=
|
|