webForumDet fria alternativet

Evighetsloop. Strängen ändras inte

.NET

5 svar · 381 visningar · startad av Pedda

Medlem sedan juni 20006 031 inlägg
Frågan#1

Följande kod är en evighetsloop.
Texten i strängen ändras aldrig trots min replace.
Skriver jag ut värdena i m.Groups[] så stämmer dom med texten i strängen.

Match m;
int i = 1;

string pattern = "<text><z-betoning z-bvariant = \"5\">(.*)</z-betoning>(.*)</text>";
for (m = Regex.Match(fileContents, pattern); m.Success; m.NextMatch())
{
     Debug.WriteLine("träff nr: " + i.ToString());
     Debug.WriteLine("Grupp 1: " + m.Groups[1]);
     Debug.WriteLine("Grupp 2: " + m.Groups[2]);

     i++;
     Regex rgx = new Regex("<text><z-betoning z-bvariant = \"5\">" + m.Groups[1] + "</z-betoning>" + m.Groups[2] + "</text>");
     fileContents = rgx.Replace(fileContents, "<obs><obstext><z-betoning z-bvariant = \"5\">" + m.Groups[1] + "</z-betoning>" + m.Groups[2] + "</obstext></obs>");
                        
}

Någon som förstår varför strängen inte ändras? Förmodligen något skitfel man har gjort som vanligt. ;) :l

Medlem sedan aug. 20039 340 inlägg
#2
  1. Var och hur är fileContents definierad?
  2. Debug.WriteLine(fileContents); precis före och efter replace.
    Edit: 3) Hur definieras m.Success av specen? Kommer det verkligen uppnås i loopen?
Medlem sedan juni 20006 031 inlägg
#3

1. string fileContents = File.ReadAllText(filename, Encoding.GetEncoding(1252));
2. Har inte testat att skriva strängen till debuggern, den är ganska lång.
3. m.Success är ju när matchningen är slut. Och eftersom han får samma träff hela tiden så tar det aldrig slut.

Medlem sedan aug. 20039 340 inlägg
#4

Vad jag kan komma på så är det att något i m.Groups[1] eller m.Groups[2] is sig självt utgör en specialtecken för regex och stör ersättningen. (+*? etc)
Men jag antar att detta är en engångsprocess för att uppdatera syntaxen i en xml-fil?
Jag skulle nog ha löst problemet ungefär så här: (Med undantag för ev småfel eftersom min .net är lite rostig och jag inte har möjlighet att texta koden)

Regex rgx = new Regex("<text><z-betoning z-bvariant = \"5\">(.*)</z-betoning>(.*)</text>");
rgx.global = true;

fileContents = rgx.Replace(fileContents, "<obs><obstext><z-betoning z-bvariant = \"5\">$1</z-betoning>$2</obstext></obs>");
Medlem sedan juni 20006 031 inlägg
#5

rgx har inte global.

Innehållet i m.Groups[1]
Not 1.</z-betoning> Ett <z-betoning z-bvariant = "1">System</z-betoning> är en variant av <z-betoning z-bvariant = "1">B-System

Innehållet i m.Groups[2]
som kan bestå av (FFX) plus ett antal andra element, delsystem och funktioner (i det följande benämnda FFX-system-element) som erfordras för provtagning. “Provtagning” inkluderar också test, start och inhämtning och/eller utlämning

Jag är dålig på RegEx men tar inte (.*) det mesta?

/red
Ja, det är en xml fil jag ska ändra lite i

Medlem sedan juni 20006 031 inlägg
#6

Löste det så här:

Regex rx = new Regex("<text><z-betoning z-bvariant = \"5\">(.*)</z-betoning>(.*)</text>");

                    MatchCollection matches = rx.Matches(fileContents);

                    // Hur många träffar fanns det?
                    Debug.WriteLine("Totalt antal träffar. " + matches.Count);

                    // Loopa igenom alla träffar
                    foreach (Match m in matches)
                    {
                        fileContents = rx.Replace(fileContents, "<obs><obstext><z-betoning z-bvariant = \"5\">" + m.Groups[1].Value + "</z-betoning>" + m.Groups[2].Value + "</obstext></obs>", 1);
                        Debug.WriteLine("Träff nr: " + i.ToString());
                        i++;
                    }
257 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)