2011-04-29 119 views
13

Necesito una expresión regular que me da la palabra antes y después de una palabra específica, incluida la palabra de búsqueda en sí.regex para encontrar una palabra antes y después de una palabra específica

como: "Esto es un texto simulado para encontrar una palabra" debería darme una serie de "ficticio texto a" cuando texto es mi palabra de búsqueda.

Otra cuestión, es posible que la cadena proporcionada contendrá más de una vez la palabra de búsqueda, así que debo ser capaz de recuperar todas las coincidencias en esa cadena con C#.

Al igual que "Esto es un texto simulado para encontrar una palabra de una cadena completa con el texto y las palabras" debe devolver:

  • "ficticio texto a"
  • "con texto y"

EDIT: En realidad, debería tener todas las coincidencias devueltas que contengan la palabra de búsqueda. Algunos ejemplos: El texto está demasiado leído. -> El texto es

Lea mi texto. -> mi texto

Este es un ejemplo de texto de campo -> un ejemplo de texto de campo

+0

¿Y qué pasa si la cadena es "Necesito texto a maniquí"? ¿Debería devolver "al texto de texto" y "texto de texto a"? –

+0

de hecho, solo la palabra antes y después de mi palabra de búsqueda, cualquiera que sea :) – PitAttack76

+0

¿Qué pasa con '" un texto dos texto tres "'? es decir, ¿necesita manejar coincidencias superpuestas? – ridgerunner

Respuesta

15

EDIT:

Si desea agarrar todo el contenido del espacio antes de la primera palabra en el espacio después de la palabra uso:

(?:\S+\s)?\S*text\S*(?:\s\S+)? 

A pruebas sencillas:

string input = @" 
    This is some dummy text to find a word in a string full with text and words 
    Text is too read 
    Read my text. 
    This is a text-field example 
    this is some dummy [email protected] to read"; 

var matches = Regex.Matches(
    input, 
    @"(?:\S+\s)?\S*text\S*(?:\s\S+)?", 
    RegexOptions.IgnoreCase 
); 

los partidos son:

dummy text to 
with text and 
Text is 
my text. 
a text-field example 
dummy [email protected] to
+0

¡Se ve bien! Pero, ¿y si hay otros caracteres antes o después de la palabra? Me gusta @ o. o algo, algo ¿Es posible tomar todo el contenido del espacio antes de la primera palabra en el espacio después de la palabra? Entonces, "esto es un dummy [email protected] para leer" aún "resultaría en" dummy [email protected] to ", pero de esta manera se incluyen todos los demás caracteres y palabras. Sry por ser semejante. O debo resolverlo. esto sin regex? – PitAttack76

+0

quiero cadena completa antes del texto y entre el texto ..., ¿cómo puedo hacerlo – Anjali

+0

@Alex puede comprobar esta pregunta http://stackoverflow.com/questions/19131758/how-to-split-a -string-into-a-array-of-strings – Anjali

1
([A-z]+) text ([A-z]+) 

haría muy bien

+3

'[A-z]' coincide con más de lo que piensas. Necesitará '[A-Za-z]' al menos (que aún fallará en palabras que contengan caracteres que no sean ASCII ...). –

2
/[A-Za-z'-]+ text [A-Za-z'-]+/ 

debería funcionar en la mayoría de casos, incluyendo palabras con guiones y compuestas .

+0

thx, eso fue rápido. ¿Puedes mostrarme la línea C# para usar esta expresión regular? ¡Gracias! – PitAttack76

+0

No soy un programador de C#, pero [MSDN docs] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx # Y6404) tiene un ejemplo muy completo de cómo usar expresiones regulares en C#, lo cual debería ser muy útil para usted. – eykanal

6
//I prefer this style for readability 

string pattern = @"(?<before>\w+) text (?<after>\w+)"; 
string input = "larry text bob fred text ginger fred text barney"; 
MatchCollection matches = Regex.Matches(input, pattern); 

for (int i = 0; i < matches.Count; i++) 
{ 
    Console.WriteLine("before:" + matches[i].Groups["before"].ToString()); 
    Console.WriteLine("after:" + matches[i].Groups["after"].ToString()); 
} 

/* Output: 
before:larry 
after:bob 
before:fred 
after:ginger 
before:fred 
after:barney 
*/ 
Cuestiones relacionadas