Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Pattern (string) auswerten und auf ein Objekt anwenden (EMail-Adresse erzeugen)
serial
myCSharp.de - Member



Dabei seit:
Beiträge: 902

Themenstarter:

Pattern (string) auswerten und auf ein Objekt anwenden (EMail-Adresse erzeugen)

beantworten | zitieren | melden

Hallo,

ich habe gerade ein kleines Problem, und wollte mal von euch eine elegante Möglichkeit wissen wie ich dieses lösen kann:

Ich habe ein Objekt, welches unterschiedliche Eigenschaften hat, nun soll aus den Werten dieser Eigenschaften ein string erzeugt werden. (zB Email-Adresse)

Wie die Werte verwendet werden, werden in einem Pattern dargestellt.

Beispielpattern:

{Name}.{Surename:1}

Wenn wir jetzt ein Objekt haben, welches die Eigenschaft Name mit dem Wert "Mustermann", und eine Eigenschaft Surename mit dem Wert "Max" hat, soll daraus folgendes erzeugt werden:

Mustermann.M (das :1 hinter Surename heisst, nur der erste Buchstabe)

Dieses Pattern ist dabei Flexibel, dass man auch {Surename}_{Name:8} (Max_Musterma) verwenden kann, oder {Surename}_{Name}.{Surename:1} (Max_Mustermann.M) etc...

Wie würdet ihr das am elegantesten abbilden? Ich dachte an Regex.Split, aber so richtig ist die Lösung noch nicht in meinen Gedanken materialisiert. Vielleicht kann mir jemand einen Denkanstoß geben :)

mfg
Serial
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Mit Regex die Werte und die optionale Länge holen (Match statt Split)
Die Groups auslesen, die den Wert und die Länge haben.
Dann die Werte mit Hilfe dieser Informationen bilden.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo serial,

oder gleich für die Pattern eine Syntax wählen, die man direkt für String.Format verwenden kann.

herbivore

PS: Siehe auch FormatWith 2.0 - String formatting with named variables - James Newton-King
private Nachricht | Beiträge des Benutzers
serial
myCSharp.de - Member



Dabei seit:
Beiträge: 902

Themenstarter:

beantworten | zitieren | melden

Hi Abt,

das hört sich logisch an, danke. Komm ich da auch noch einfach an die Seperatoren ran (ich kenn mich mit regex nicht wirklich aus).

@herbivore: danke, ich schau mir das mal an. Leider habe ich nur teilweise einfluss auf das pattern

mfg
serial
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von serial am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo serial,

ich bin zwar nicht Abt, aber ja, klar, kommt man, siehe [Artikel] Regex-Tutorial.

herbivore
private Nachricht | Beiträge des Benutzers
serial
myCSharp.de - Member



Dabei seit:
Beiträge: 902

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke herbivore für den Tipp, ich habe das FormatsWith entsprechend angepasst, um genau die oben genannte Syntax zu erreichen.

Hier der Code, sollte es jemanden interessieren:


 public static string FormatWith(this string format, IFormatProvider provider, object source)
        {
            if (format == null)

                throw new ArgumentNullException("format");

            Regex r = new Regex(@"\{\{|\{([\w\.\[\]]+)((?:[,:][^}]+)?\})",
 RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

            List<object> values = new List<object>();
            string rewrittenFormat = r.Replace(format, delegate(Match m)
            {
                string propertyName = m.Groups[1].Value;

                if (propertyName.Length == 0)
                    return m.Value;

                values.Add(propertyName == "0" ? source : DataBinder.Eval(source, propertyName));

                string len = m.Groups[2].Value.Replace(",", "").Replace("}", "").Replace(" ", "").Replace(":","");
                if (!String.IsNullOrEmpty(len))
                {
                    int leng;
                    if (Int32.TryParse(len, out leng))
                    {
                        string value = values[values.Count - 1].ToString();
                        value = value.Substring(0, leng);
                        values[values.Count - 1] = value;
                    }
                }
                return "{" + (values.Count - 1) +"}";
            });
            return string.Format(provider, rewrittenFormat, values.ToArray());
        }

mfg
Serial
private Nachricht | Beiträge des Benutzers