Wyrażenie regularne - jak podmienić string?

0

Mam take wyrażenie: (Top="\d+")|(Top="\d+\.\d+")
I taki tekst:

<Grid Name="MainPanel" Grid.Column="1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Canvas Background="#00FFFFFF" Name="Canvas1" Width="Auto" Height="Auto" Visibility="Visible"><Button Name="Button1" Width="180.5" Height="120.5" Opacity="1" Effect="{x:Null}" Visibility="Visible" Canvas.Left="161.5" Canvas.Top="82.5">dfsdf</Button><TextBlock Text="TextBlock1&#xA;" FontSize="22" Foreground="#FF000000" Background="{x:Null}" Name="TextBlock1" Width="269" Height="54" Opacity="1" Effect="{x:Null}" Visibility="Visible" Canvas.Left="144" Canvas.Top="245" /><Label Background="#00FFFFFF" Foreground="#FF000000" FontSize="22" Name="Label1" Width="194" Height="100" Opacity="1" Effect="{x:Null}" Visibility="Visible" Canvas.Left="429" Canvas.Top="102">153</Label><Label Name="Label1" Width="50" Height="30" Canvas.Left="150" Canvas.Top="20"><Label.Effect><DropShadowEffect ShadowDepth="0" Color="#FF000000" Opacity="1" BlurRadius="5" /></Label.Effect>15.8</Label></Canvas><Canvas Background="#00FFFFFF" Name="Canvas2" Width="Auto" Height="Auto" Visibility="Hidden"><Button Content="{x:Null}" Name="Button2" Width="292.5" Height="207.5" Opacity="1" Effect="{x:Null}" Visibility="Visible" Canvas.Left="248.5" Canvas.Top="123.5" /><Image Source="file:///D:/prezenter/images/Desert.jpg" Stretch="Fill" Name="Image1" Width="355" Height="482" Opacity="1" Effect="{x:Null}" Visibility="Visible" Canvas.Left="560" Canvas.Top="16" /></Canvas></Grid>

Chcę przemnożyć wszystkie wartości w "" takie jak Width, Height, Canvas.Top, Canvas.Left i FontSize i zapisać je z powrotem. Wzór na razie dopasowuje Top="123" a chce same liczby i tylko wymienionych właściwości. Jak to zrobić? Czy mogę jakoś jedno wyrażenie przelecieć innym?
Chodzi mi o to że jak dostanę Top="123" i to jeszcze raz innym wyrażeniem tak żebym dostał 123. Czy to jakoś lepiej da się zrobić?

0

Nie rozumiem problemu. Obejmij nawiasem tylko \d+ a nie całe Top="\d+" i już. Albo dodaj jeszcze jeden nawias dookoła samego \d+ i wyciągnij potem tą grupę.

0

Ja też Ciebie nie rozumiem, zmieniłem na coś takiego: Top="((\d+)|(\d+\.\d+))"

0

No i? Powinno teraz być ok.

0

Tak i dostaje:

Top="82.5"
Top="245"
Top="102"
Top="20"
Top="123.5"
Top="16"

Teraz jak dostać same liczby? Muszę pisać regexa dla regexa?

1

Musisz wybrać Groups a nie cały string z Match np:

            string text = richTextBox1.Text;
            Regex re = new Regex("Top=\"((\\d+)|(\\d+\\.\\d+))\"");
            //ewentualnie można Regex re = new Regex("Top=\"([^\"]+)\"");
            MatchCollection mc = re.Matches(text);   
            foreach (Match m in mc)
            {
                listBox1.Items.Add(m.Groups[1]);
            }
0

O coś takiego mi chodziło, ale to jeszcze nie koniec. Teraz muszę to wymnożyć i podmienić.

Regex re = new Regex("Top=\"((\\d+)|(\\d+\\.\\d+))\"");
            //ewentualnie można Regex re = new Regex("Top=\"([^\"]+)\"");
            MatchCollection mc = re.Matches(text);
            foreach (Match m in mc)
            {
                double toReplace = double.Parse(m.Groups[1].ToString(), CultureInfo.InvariantCulture);
                toReplace *= 2;

                //re.Replace(text,)
                Console.WriteLine(m.Groups[1] +" " + toReplace);
            }

Kombinuje ale nie wiem jak.

            string outstring = "";
            StreamReader sr = new StreamReader(@"D:\prezenter\file.txt");
            string text = sr.ReadToEnd();
            string pattern = @"Top=""\d+\.?\d*""";
            MatchCollection colection = Regex.Matches(text, pattern);
            foreach (Match m in colection)
            {
                Match s = Regex.Match(m.ToString(), @"\d+\.?\d*");
                double l = double.Parse(s.ToString(), CultureInfo.InvariantCulture);
                outstring = Regex.Replace(m.ToString(), @"\d+\.?\d*", (l * 2).ToString(), RegexOptions.None);
                text = text.Replace(m.ToString(), outstring);
            }

Dobra udało mi się :P

0

Odświeżam temat bo pojawił się problem z tym wyrażeniem. Zmodyfikowałem je tak:

private string Resize(string text)
        {
            List<string> list = new List<string> { "Top=", "Left=", "Height=", "Width=", "FontSize=" };
            foreach (string p in list)
            {
                string pattern =p+ @"""\d+\.?\d*""";
                Regex rx = new Regex(pattern);
                text = rx.Replace(text, new MatchEvaluator(Multiply));
            }
            return text;
        }

I ta metoda uruchamia tą:

private string Multiply(Match m)
        {
            Match s = Regex.Match(m.ToString(), @"\d+\.?\d*");
            double l = double.Parse(s.ToString(), System.Globalization.CultureInfo.InvariantCulture);
            string outstring = Regex.Replace(m.ToString(), @"\d+\.?\d*", (l * 2).ToString(System.Globalization.CultureInfo.InvariantCulture), RegexOptions.None);
            return outstring;
        }

I było by pięknie gdyby nie to że teraz w tekście pojawiło się to: <Grid Width="100" Height="100"> I tego nie wolno zmienić. W tym przypadku te wartości zawsze będą po 100 więc to jest chyba ułatwienie.
Jak teraz zmodyfikować te metody? Sprawa pilna, potrzebne na dziś do południa.

0

Jak pilne to zabieraj się za czytanie:
http://en.wikipedia.org/wiki/Regular_expression
znajdziesz tam informacje jak oznaczyć w wyrażeniu sytuacje "X jest różne od ..."

0

Nie znalazłem tego.
[^abc] oznacza różne, ale od każdego znaku, jak dam [^(abc)] żeby połączyć te znaki to działa tak samo jak by nie było().
Możesz powiedzieć jeśli wiesz?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0