2012-04-24 12 views
6

Ich suche Regex in C# nach Begriffen zu suchen und ich möchte die Plural dieser Begriffe in die Suche aufnehmen. Wenn der Benutzer zum Beispiel nach 'pipe' suchen möchte, möchte ich auch Ergebnisse für 'pipes' liefern.Matching Plural mit Regex in C#

So kann ich dies tun ...

string s ="\\b" + term + "s*\\b"; 
if (Regex.IsMatch(bigtext, s) { /* do stuff */ } 

Wie würde ich die oben ändern, mir zu erlauben, sagen wir entsprechen ‚betont‘, wenn der Benutzer ‚Stress‘ betritt und nach wie vor für ‚Rohr‘ funktioniert/"Rohre"?

+1

Sergi - Ich hänge meinen Kopf in Schande ...Ich werde meine alten Fragen noch einmal aufgreifen und es klären! sch - Nicht sonderlich beunruhigt über die Kuriositäten, die Englisch zulässt ... Ich denke, dass all das ein Projekt wäre, wenn man all diese Dinge einfangen würde. – SAL

Antwort

1

Hier ist ein regulärer Ausdruck erstellt, um die Plurale zu entfernen:

/(?<![aei])([ie][d])(?=[^a-zA-Z])|(?<=[ertkgwmnl])s(?=[^a-zA-Z])/g 

(Demo & source)

Ich weiß, es ist nicht genau das, was Sie brauchen, aber es kann Ihnen etwas herausfinden helfen.

+0

Dank ThdK - http://gskinner.com/RegExr/ ist eine brillante Möglichkeit, Regex-Ausdrücke zu testen. – SAL

+0

Ich finde es gerade erst, noch nie zuvor davon gehört. Es hat bereits eine Menge von perfekten Regex von der Community erstellt, und wenn sie nicht das sind, was Sie suchen, können Sie sie im laufenden Betrieb ändern :) – ThdK

+1

Viel Spaß mit diesen: http: //www.english-zone. com/Rechtschreibung/plurals.html –

0

Wenn Sie SQL Server als Ihr Backend verwenden, können Sie Soundex nicht verwenden? Ich bin mir nicht sicher, wonach Sie suchen. Ich nehme an, Sie versuchen, dynamisches SQL als Sucheingabe zu erstellen. Wenn nicht, denke ich, dass es SoundEx für LINQ gibt.

EDIT: Ich stehe korrigiert, es scheint, es gibt einige Linq zu SQL Entity Zeug, die für SoundEx getan werden können.

Allerdings hat MSDN ein Soundex-Beispiel, das für die einfachen Tests, die ich heute Morgen ausgeführt habe, scheint gut zu machen, was ich getestet habe. http://msdn.microsoft.com/en-us/library/bb669073.aspx

Die Veränderung I gemacht anstelle von .ToUpper (invariant) i .ToUpperInvariant() verwendet und anstelle des Weitergabe (string Wort) i eine Erweiterungsmethode verwendet (dieses Wort-String)

Hier ist ein Beispiel von dem, was ich lief

List<string> animals = new List<string>(); 
animals.Add("dogs"); 
animals.Add("dog"); 
animals.Add("cat"); 
animals.Add("rabbits"); 
animals.Add("doggie"); 

string dog = "dog"; 
var data = from animal in animals 
where animal.SoundEx() == dog.SoundEx() 
select animal; 

Daten: Hunde, Hund, Hunde

Jetzt mit SQL-Server, die mit Enthält/Freetext/Contains etc und SoundEx gegen einen Katalog (ich bin nicht vertraut mit dem ne mit Wenn Sie SQL-Server-Versionen verwenden, die auf die Implementierung von SQLServer 2000 zurückgehen, können Sie auch Ihre Ergebnisse bewerten.

Auch wenn Sie haben die Möglichkeit, SQL-Server verwenden Sie in diese Option suchen möchten: LINQ to SQL SOUNDEX - possible?

Die Sorge mit der Pluralisierung Lösung, Sie müssen in der Lage sein, .Net 4.

zu nutzen Es gibt auch den Levenshtein-Distanzalgorithmus, der nützlich sein kann.

+0

Willkommen bei Stack Overflow! Wie wäre es, Ihrer Antwort mehr Substanz in Form eines Arbeitsbeispiels für die von Ihnen vorgeschlagene Technik zu geben? –

7

Das Problem, das Sie sich stellen können, ist, dass es viele unregelmäßige Substantive wie man, fish und index gibt. Sie sollten also die PluralizationService verwenden, die eine Pluralize Methode hat. Here ist ein Beispiel, das zeigt, wie man es benutzt.

Nachdem Sie den Plural des Begriffs erhalten haben, können Sie leicht eine Regex erstellen, die sowohl den Plural als auch den Singularbegriff sucht.

PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture); 
string plural = ps.Pluralize(term); 
string s = @"("+term+"|"+plural+")"; 
if (Regex.IsMatch(bigtext, s)) { 
    /* do stuff */ 
} 
+0

Dies ist gerade im Umgang mit verschiedenen Kulturen sehr wichtig! Ich glaube nicht, dass es einen Catchall-Regex gibt (oder sein sollte). –