2016-08-02 21 views
1

Ich habe Muster-Stichwort: "Hallo {Name}, willkommen in {Land} "
und ein voller Wert string:" Hallo Scott, willkommen in VietNeinm"
Wie kann Ich extrahiere Wert von {Name} und {Land}: Name = Scott, Land = VietNam
Ich habe einige regulären Ausdruck sehen, um dieses Problem zu lösen, aber kann ich Fuzzy-Matching hier anwenden?
z.B. Mit umgekehrter Zeichenfolge "Willkommen bei VietNam, Hallo Scott", müssen wir auch den regulären Ausdruck ändern?Get String-Wert aus Platzhalter C#

+0

Ich stimme für das Schließen dieser Frage als Off-Topic ab, weil sie nicht minimalen Code enthält, um das Problem zu reproduzieren. –

+0

Ich habe versucht, mit regulären Ausdruck, aber eigentliche Frage ist, wie Wert im Allgemeinen mit weniger Ausdruck ändern – phuongnd

+0

@phuongnd Aktualisierte Antwort, wird es in beide Richtungen funktionieren. –

Antwort

1

Als allgemeinere Lösung, Sie so etwas wie folgendes tun:

public Dictionary<string, string> GetMatches(string pattern, string source) 
{ 
    var tokens = new List<string>(); 
    var matches = new Dictionary<string, string>(); 

    pattern = Regex.Escape(pattern); 

    pattern = Regex.Replace(pattern, @"\\{.*?}", (match) => 
     { 
      var name = match.Value.Substring(2, match.Value.Length - 3); 

      tokens.add(name); 

      return $"(?<{name}>.*)"; 
     }); 

    var sourceMatches = Regex.Matches(source, pattern); 

    foreach (var name in tokens) 
    { 
     matches[name] = sourceMatches[0].Groups[name].Value; 
    } 

    return matches; 
} 

Verfahren extrahiert die Token-Namen aus dem Muster, dann ersetzt die Token mit der entsprechenden Syntax für einen regulären Ausdruck namens capture group. Als Nächstes wird das modifizierte Muster als regulärer Ausdruck verwendet, um die Werte aus der Quellzeichenfolge zu extrahieren. Schließlich verwendet es die erfassten Token-Namen mit den genannten Capture-Gruppen, um ein Wörterbuch zu erstellen, das zurückgegeben werden soll.

+0

Beste jemals gesehene Lösung! – phuongnd

3

können Sie Regex verwenden:

var Matches = Regex.Matches(input, @"hello\s+?([^\s]*)\s*|welcome\s+?to\s+?([^\s]*)", RegexOptions.IgnoreCase); 

string Name = Matches.Groups[1].Value; 
string Country = Matches.Groups[2].Value; 

Update: Geänderte Code oder so zu arbeiten. Demo.

+1

Besser noch, verwenden Sie einen regulären Ausdruck, um die Token aus der Vorlage zu extrahieren und einen neuen regulären Ausdruck zu erstellen, bei dem die ursprünglichen Token durch benannte Capture-Gruppen ersetzt werden und der Rest der Zeichenfolge maskiert wird. – seairth

0

nur quick and dirty ..

string pattern = "Hello Scott, welcome to VietNam"; 

var splitsArray = pattern.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 
var Name = splitsArray[1].Replace(",", string.Empty); 
var country = splitsArray[4];