2016-07-29 5 views
-2

Ich habe Regex Muster (etwa 100 oder so), die Regex-Klasse in C# implementiert sind. Jetzt möchte ich verschiedene Gewichte geben, wenn meine Eingabe-Strings verschiedenen Mustern getroffen, für Instanzen:Hit verschiedene Regex-Muster und geben Sie dann unterschiedliche Gewicht in C#

input_string = "xxxx... "; 
weight=0.; 
Regex name_exp=new Rex("pe[t,e]er|j[o,0]hn|may|...."); 
if (name_exp.Match(input_string).Success==true); 
{ 
     weight = (0.5 if it hits pe[t,e]er, 0.3 if it hits j[o,0]hn...) 
}   

Wie gestalten Sie ein Programm, um es in einer besseren Art und Weise zu tun, da ich 100 Muster haben, zur Liste alle von ihnen ist nicht sehr effizient. Ich denke auch über die Verwendung der Karte nach. Aber kann der Kartenindex ein Regex sein? Dank

+0

abgestimmt haben: [Dies] (http://stackoverflow.com/a/7707369/92546) kann hilfreich sein, wenn Sie laufen in Leistungsprobleme mit mehreren Regex-Mustern. Oder nicht. – HABO

+0

Sie wollen nicht wirklich Kommas in der Mitte der Namen ('Pe, er', 'j, hn') übereinstimmen, oder? Ein Komma hat in einer Zeichenklasse keine besondere Bedeutung. –

+0

Es ist nicht ganz klar, was "besser" hier bedeutet. Bitte versuchen Sie, Ihre Frage anzugeben. – YakovL

Antwort

1

Sie könnten eine Klasse machen, die das Muster und das Gewicht in sich hat, auf den Instanzen eine Schleife tun, und wenden Sie das Gewicht von dem Objekt

public class WeightedRegex 
{ 
     public int Weight {get;set;} 
     public Regex Regex {get;set;} 
} 

Sie müssen nicht für die Notwendigkeit zu prüfen, größer als regex, wenn eine der Personen Neben abgestimmt, dann wäre es mit dem größeren

//in your method 
//assuming you have a List of WeightedRegex called regexes 
var match = regexes.FirstOrDefault(a=>a.Regex.IsMatch(input_string)); 
if(match!=null) 
{ 
    weight = match.Weight; 
} 
+1

Ich denke, du meinst 'if (false! = (Name_exp.Match (input_string) .Success == true)) {' ... –

+0

Danke @konkked!, Es funktioniert. – Mrk421

Verwandte Themen