Avatar billede nidyahou Praktikant
07. juli 2009 - 17:40 Der er 13 kommentarer og
1 løsning

reserver [ ] til keys

Vældig klassik problemstilling.

Jeg koder i c# og har en streng hvor brugeren indtaster nogle keys i klammer ex:

[key1]
[key2]

som så skal erstattes af noget dynamisk tekst.

Det jeg ønsker mig er en regular expression statement som tager [] og isolerer teksten indeni så jeg kan lave en lowercase switch statement og vælge hvad der skal udskiftes ex:

switch RegExOutPut.toLower()
case "key1":

break;
case "key2":

break;
Avatar billede arne_v Ekspert
07. juli 2009 - 18:00 #1
@"\[([^\]]*)\]" kan vek fange det mellem [].
Avatar billede nidyahou Praktikant
07. juli 2009 - 18:10 #2
great - du dropper bare et svar. Har du noget forslag til en switch replace af keys?
Avatar billede arne_v Ekspert
07. juli 2009 - 18:21 #3
Jeg er ikke helt sikker paa at jeg forstaar hvad du vil med den switch.

Er forventningen at den er hurtigere end N simple .Replace ?
Avatar billede nidyahou Praktikant
07. juli 2009 - 18:30 #4
Det er simpelthen blot en konsekvens af dårlig gennemtænkning jeg kommer nok bare til at lave en anden metode og regex som fanger en bestemt key altså:
        private static string RegexReplace(string msg, string key, string replacekey)
        {
            return Regex.Replace(msg, ("\[" + key + "\]"), replacekey);
        }
Avatar billede nidyahou Praktikant
07. juli 2009 - 18:30 #5
og så kalde den metode en gang for hver key og hvad den skal erstattes med
Avatar billede arne_v Ekspert
07. juli 2009 - 18:34 #6
Du behoever ikke engang Regex Replace - String Replace er god nok !
Avatar billede arne_v Ekspert
07. juli 2009 - 18:34 #7
Lidt kode:

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = "xxx [key1] yyy [key2] zzz";
            string s2 = s.Replace("[key1]", "foo").Replace("[key2]", "bar");
            Console.WriteLine(s2);
            string s3 = s;
            Regex re3 = new Regex(@"\[([^\]]*)\]");
            foreach(Match m in re3.Matches(s))
            {
                switch(m.Groups[1].Value)
                {
                    case "key1":
                        s3 = s3.Replace("[key1]", "foo");
                        break;
                    case "key2":
                        s3 = s3.Replace("[key2]", "bar");
                        break;
                }
            }
            Console.WriteLine(s3);
            Dictionary<string, string> d = new Dictionary<string, string>();
            d.Add("key1", "foo");
            d.Add("key2", "bar");
            string s4 = s;
            Regex re4 = new Regex(@"\[([^\]]*)\]");
            foreach(Match m in re4.Matches(s))
            {
                s4 = s4.Replace("[" + m.Groups[1].Value + "]", d[m.Groups[1].Value]);
            }
            Console.WriteLine(s4);
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
07. juli 2009 - 18:35 #8
og et svar
Avatar billede arne_v Ekspert
07. juli 2009 - 18:44 #9
Og med en rigtig 1980'er loesning tilfoejet:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = "xxx [key1] yyy [key2] zzz";
            string s2 = s.Replace("[key1]", "foo").Replace("[key2]", "bar");
            Console.WriteLine(s2);
            string s3 = s;
            Regex re3 = new Regex(@"\[([^\]]*)\]");
            foreach(Match m in re3.Matches(s))
            {
                switch(m.Groups[1].Value)
                {
                    case "key1":
                        s3 = s3.Replace("[key1]", "foo");
                        break;
                    case "key2":
                        s3 = s3.Replace("[key2]", "bar");
                        break;
                }
            }
            Console.WriteLine(s3);
            Dictionary<string, string> d = new Dictionary<string, string>();
            d.Add("key1", "foo");
            d.Add("key2", "bar");
            string s4 = s;
            Regex re4 = new Regex(@"\[([^\]]*)\]");
            foreach(Match m in re4.Matches(s))
            {
                s4 = s4.Replace("[" + m.Groups[1].Value + "]", d[m.Groups[1].Value]);
            }
            Console.WriteLine(s4);
            StringBuilder sb = new StringBuilder();
            int ix = 0;
            while(ix < s.Length)
            {
                int newix = s.IndexOf("[key", ix);
                if(newix > 0)
                {
                    sb.Append(s.Substring(ix, newix - ix));
                    string key = s.Substring(newix + 1, s.IndexOf("]", newix + 4) - newix - 1);
                    sb.Append(d[key]);
                    ix = newix + key.Length + 2;
                }
                else
                {
                    sb.Append(s.Substring(ix));
                    ix = s.Length;
                }
            }
            string s5 = sb.ToString();
            Console.WriteLine(s5);
            Console.ReadKey();
        }
    }
}
Avatar billede nidyahou Praktikant
07. juli 2009 - 19:02 #10
og så er issuet i at lave string replace at det er afhængigt af brugerinput så det er ikke vist om de skriver [key1]eller [Key1] eller [kEY1] osv. ;)
Avatar billede arne_v Ekspert
07. juli 2009 - 19:13 #11
Hvis du skal understoette alle mulige mixed cases saa er Regex Replace langt nemmere end String Replace.
Avatar billede nidyahou Praktikant
07. juli 2009 - 19:18 #12
yes - det var derfor jeg efterspurgte det ;)
Avatar billede arne_v Ekspert
07. juli 2009 - 19:27 #13
Men igen ville jeg vaelge den simple variant:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string s = "xxx [kEy1] yyy [KeY2] zzz";
            string sx = s;
            sx = Regex.Replace(sx, @"\[key1\]", "foo", RegexOptions.IgnoreCase);
            sx = Regex.Replace(sx, @"\[key2\]", "bar", RegexOptions.IgnoreCase);
            Console.WriteLine(sx);
            Console.ReadKey();
        }
    }
}
Avatar billede nidyahou Praktikant
07. juli 2009 - 19:39 #14
as would I.

perfekt. tusind tak endnu engang
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester