2012-04-24 12 views
6

Estoy buscando utilizar expresiones regulares en C# para buscar términos y quiero incluir los plurales de esos términos en la búsqueda. Por ejemplo, si el usuario quiere buscar 'pipe', también quiero devolver resultados para 'pipes'.Coincidencia de plurales usando expresiones regulares en C#

Así que puedo hacer esto ...

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

¿Cómo puedo modificar lo anterior que me permita partido, digamos, 'subraya' cuando el usuario introduce 'estrés' y todavía funciona para 'tubería' /'tubería'?

+1

Sergi - I hang my head in shame ...Volveré a revisar mis viejas preguntas y lo solucionaré. sch: No me preocupan demasiado las rarezas que el inglés permite ... Creo que atrapar a todos esos sería un proyecto. – SAL

Respuesta

1

Aquí es una expresión regular creado para eliminar los plurales:

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

(Demo & source)

Yo sé que no es exactamente lo que necesita, pero puede ayudar a encontrar algo.

+0

Gracias ThdK - http://gskinner.com/RegExr/ es una manera brillante de probar expresiones de expresiones regulares. – SAL

+0

Lo acabo de encontrar recientemente, nunca lo había escuchado antes. Ya tiene muchos regex perfectos creados por la comunidad, y si no son lo que estás buscando, puedes modificarlos sobre la marcha :) – ThdK

+1

Diviértete con estos: http: //www.english-zone. com/spelling/plurals.html –

0

Si está utilizando SQL Server como servidor, ¿no podría utilizar Soundex? No estoy seguro de lo que estás tratando de buscar. Supongo que está intentando crear SQL dinámico como entrada de búsqueda. Si no, creo que hay SoundEx para LINQ.

EDITAR: Estoy corregido, parece que hay algo de linq en materia de entidad sql que se puede hacer para SoundEx.

Sin embargo, MSDN tiene un ejemplo soundex, que para las pruebas simples que ejecuté esta mañana parece funcionar bien en cuanto a lo que probé. http://msdn.microsoft.com/en-us/library/bb669073.aspx

El cambio que hice fue lugar de .ToUpper (invariante) i utilizado .ToUpperInvariant() y en lugar de pasar (palabra cadena) i utiliza un método de extensión (esta palabra string)

Aquí es un ejemplo de lo que me encontré

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; 

de datos: perros, perro, perrito

Ahora con el servidor SQL, utilizando el Contiene/FreeText/CONTAINSTABLE etc y el uso de SoundEx un catálogo (no estoy familiarizado con el NE wer versiones de SQL server - volviendo a la implementación SQLServer 2000 que utilicé), también podría clasificar sus resultados.

Además, si usted tiene la capacidad de utilizar el servidor SQL es posible que desee ver en esta opción: LINQ to SQL SOUNDEX - possible?

La preocupación con la solución Pluralización, debe ser capaz de utilizar .Net 4.

También está el algoritmo de distancia Levenshtein que puede ser útil.

+0

¡Bienvenido a Stack Overflow! ¿Qué le parece proporcionar más contenido a su respuesta en forma de un ejemplo práctico de la técnica que está sugiriendo? –

7

El problema que puede enfrentar es que hay muchos sustantivos irregulares como man, fish y index. Por lo tanto, debería considerar usar el PluralizationService que tiene un método Pluralize. Here es un ejemplo que muestra cómo usarlo.

Después de obtener el plural del término, puede construir fácilmente una expresión regular que busque tanto el término en plural como el singular.

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

¡Esto es bastante importante, especialmente cuando se trata de culturas diferentes! No creo que haya (o deba haber) un catchall regex. –

Cuestiones relacionadas