Avatar billede milandt Nybegynder
02. august 2008 - 21:35 Der er 7 kommentarer og
1 løsning

Regex replace

Hej eksperter,

Jeg har en tekst fra et CMS system:

string text = "Lorem ipsum dolor {currency} sit amet, consectetuer adipiscing elit. Quisque et sem {language} ullamcorper est consequat porta.";

Bemærk de to placeholders der er placeret i teksten i form af tuborgklammer.

Jeg vil gerne i en meget elegant løsning for hver match af en sådan placeholder udskifte indholdet med string Content.Get(string key) sådan at de rigtige værdier indsættes ud fra nogle kriterier som denne metode tester for.

På forhånd tak
Dennis
Avatar billede arne_v Ekspert
02. august 2008 - 21:55 #1
Løsning med regex:

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

namespace E
{
    public class Program
    {
        public static string XReplace(string s, Dictionary<string, string> rpl)
        {
            string res = s;
            Regex re = new Regex("{([^}]+)}", RegexOptions.Compiled);
            foreach(Match m in re.Matches(s))
            {
                res = res.Replace(m.Groups[0].Value, rpl[m.Groups[1].Value]);
            }
            return res;
        }
        public static void Main(string[] args)
        {
            string text = "Lorem ipsum dolor {currency} sit amet, consectetuer adipiscing elit. Quisque et sem {language} ullamcorper est consequat porta.";
            Dictionary<string, string> rpl = new Dictionary<string, string>();
            rpl.Add("currency", "DKK");
            rpl.Add("language", "Danish");
            rpl.Add("foo", "bar");
            Console.WriteLine(text);
            Console.WriteLine(XReplace(text, rpl));
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
02. august 2008 - 22:00 #2
Løsning uden regex:

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

namespace E
{
    public class Program
    {
        public static string XReplace(string s, Dictionary<string, string> rpl)
        {
            StringBuilder res = new StringBuilder();
            StringBuilder tmp = null;
            bool inangles = false;
            for(int i = 0; i < s.Length; i++)
            {
                switch(s[i])
                {
                    case '{':
                        inangles = true;
                        tmp = new StringBuilder();
                        break;
                    case '}':
                        inangles = false;
                        res.Append(rpl[tmp.ToString()]);
                        break;
                    default:
                        if(inangles)
                        {
                            tmp.Append(s[i]);
                        }
                        else
                        {
                            res.Append(s[i]);
                        }
                        break;
                }
            }
            return res.ToString();
        }
        public static void Main(string[] args)
        {
            string text = "Lorem ipsum dolor {currency} sit amet, consectetuer adipiscing elit. Quisque et sem {language} ullamcorper est consequat porta.";
            Dictionary<string, string> rpl = new Dictionary<string, string>();
            rpl.Add("currency", "DKK");
            rpl.Add("language", "Danish");
            rpl.Add("foo", "bar");
            Console.WriteLine(text);
            Console.WriteLine(XReplace(text, rpl));
            Console.ReadKey();
        }
    }
}
Avatar billede milandt Nybegynder
02. august 2008 - 22:08 #3
Meget fornemt.

Læg et svar :)
Avatar billede milandt Nybegynder
02. august 2008 - 22:09 #4
Holder mig til regex svaret :)

Kan foreach også udskiftes med et link expression?
Avatar billede arne_v Ekspert
02. august 2008 - 22:11 #5
svar
Avatar billede arne_v Ekspert
02. august 2008 - 22:12 #6
link expression ??

LINQ ?

Sikkert. Men jeg synes ikke at det er umiddelbart oplagt hvordan.
Avatar billede milandt Nybegynder
02. august 2008 - 22:15 #7
ah.. common type. k og q er så tæt på hinanden.

ok.
Avatar billede milandt Nybegynder
02. august 2008 - 22:15 #8
typo..

godnat
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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