2012-06-27 10 views
6

Tengo una lista de muchas palabras. Lo que necesito es encontrar todas las palabras que terminan en "ing", "ed", "ied" y con una sola vocal y una consonante duplicada antes de: Debería coincidir con las palabras: suplicado, slamming, zagging. No coincide con ayuda ("LP", no consonante doble)Regex.Match consonantes dobles en C#

\w*[^aoyie][aoyie]([^aoyie])\1(ed|ing|ied) 

Se está trabajando en RegexPal.com, pero no está trabajando en C# (no coincide con ninguna palabra, devuelve 0 palabras en la lista)

Mi código:

List<Book_to_Word> allWords = (from f in db2.Book_to_Words.AsEnumerable() select f).ToList(); 

List<Book_to_Word> wordsNOTExist = (from f in allWords 
         where Regex.IsMatch(f.WordStr, @"^(\w*[^aoyie]+[aoyie]([^aoyie])(ed|ing|ied))$") 
            select f).ToList(); 

Funciona cuando no uso \ 1. Pero devuelve palabras con una sola consonante.

+0

En regexpal.com si pongo la expresión regular anterior, no coincide con suplicar o zag. Necesita la modificación sugerida por nhahtdh para hacerlo. – Chris

+0

¿Y puede aclarar qué no funciona usando \ 1? ¿Simplemente no devuelve las cosas o se obtiene un error de compilación, arroja una excepción ...? – Chris

Respuesta

0

Gracias a nhahtdh. El problema estaba en paréntesis externos. Cuando los eliminé funcionó:

Regex.IsMatch(f.WordStr, @"^\w*[^aoyieu]+[aoyieu]([^aoyieu])\1(ed|ing|ied)$") 
+1

Pruebe probarlo contra 'zigzag' y fallará (aunque no debería, como yo lo entiendo) - Con su expresión, está diciendo que no puede haber vocales aparte del uno justo antes de la doble consonante. La respuesta de nhahtdh corrige eso por ti. También debe tenerse en cuenta que podría haber conservado el paréntesis externo y utilizado \ 2 en su lugar, si lo desea. – Chris

+0

Tienes razón. Actualizado a Regex.IsMatch (f.WordStr, @ "^ \ w * [^ aoyieu] + [aoyieu] ([^ aoyieu]) \ 1 (ed | ing | ied) $"). Ahora coincide con zigzag – Vil

+0

@Vildan: '\ w' hará que" 45435egging "o" _pp_pping "coincida. Pero si nunca ocurren en los datos, entonces está bien usarlos. – nhahtdh

6

tratar de relajarse un poco la condición:

@"^[a-z]*[aoyie]([^aoyie])\1(ed|ing|ied)$" 

Su expresión regular actual requerirá la palabra a tener al menos 3 caracteres antes de la consonante doble y el sufijo. Entonces "mendigar" y "zag" no se corresponden.

Sin embargo, es un poco extraño ver "y" en el grupo, mientras que "u" falta (por ejemplo, "asaltado"). Probablemente quieras verificarlo dos veces. Y tengo un poco de duda sobre la consonante doble antes de "ied", pero lo dejaré allí.

+0

creo, que Vildan dijo sobre '\ 1'. Verifícalo por favor. C# (como todos los idiomas, excepto 'perl') admite la versión no flexible de las expresiones regulares – gaussblurinc

+0

Lo intenté, pero aún no funciona – Vil

+0

@loldop: Back-reference es compatible con C#: http://msdn.microsoft.com/en-us /library/thwdfzxy.aspx – nhahtdh