Laden...

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

Erstellt von serial vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.128 Views
S
serial Themenstarter:in
902 Beiträge seit 2007
vor 11 Jahren
Pattern (string) auswerten und auf ein Objekt anwenden (EMail-Adresse erzeugen)

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

16.834 Beiträge seit 2008
vor 11 Jahren

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.

49.485 Beiträge seit 2005
vor 11 Jahren

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

S
serial Themenstarter:in
902 Beiträge seit 2007
vor 11 Jahren

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

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo serial,

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

herbivore

S
serial Themenstarter:in
902 Beiträge seit 2007
vor 11 Jahren

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