regulares - regex c#
¿Cómo puedo encontrar una cadena después de una cadena/carácter específico usando expresiones regulares? (3)
La expresión regular básica es esta:
var pattern = @"KeywordB:/s*(/w*)";
/s* = any number of spaces
/w* = 0 or more word characters (non-space, basically)
() = make a group, so you can extract the part that matched
var pattern = @"KeywordB:/s*(/w*)";
var test = @"KeywordB: TextToFind";
var match = Regex.Match(test, pattern);
if (match.Success) {
Console.Write("Value found = {0}", match.Groups[1]);
}
Si tiene más de uno en una línea, puede usar esto:
var test = @"KeywordB: TextToFind KeyWordF: MoreText";
var matches = Regex.Matches(test, @"(?:/s*(?<key>/w*):/s?(?<value>/w*))");
foreach (Match f in matches ) {
Console.WriteLine("Keyword ''{0}'' = ''{1}''", f.Groups["key"], f.Groups["value"]);
}
Además, consulte el diseñador de expresiones regulares aquí: http://www.radsoftware.com.au/ . Es gratis, y lo uso constantemente. Funciona muy bien para crear prototipos de expresiones. Debe reorganizar la interfaz de usuario para el trabajo básico, pero después de eso es fácil.
(fyi) La "@" antes de las cadenas significa que / ya no significa algo especial, por lo que puede escribir @ "c: / fun.txt" en lugar de "c: / fun.txt"
No tengo esperanza con expresiones regulares (c #) así que agradecería algo de ayuda:
Básicamente necesito analizar un texto y necesito encontrar la siguiente información dentro del texto:
Texto de ejemplo:
KeywordB: *** TextToFind * el resto no es relevante, pero ** KeywordB: Text ToFindB y más texto.
Necesito encontrar la (s) palabra (s) después de cierta palabra clave que puede terminar con un ":".
[ACTUALIZAR]
Gracias Andrew y Alan: Perdón por volver a abrir la pregunta, pero falta algo bastante importante en esa expresión regular. Como escribí en mi último comentario, ¿es posible tener una variable (cuántas palabras buscar, dependiendo de la palabra clave) como parte de la expresión regular?
O bien: podría tener una expresión regular diferente para cada palabra clave (solo tendrá una mano llena). Pero todavía no sé cómo tener las "palabras para buscar" constantes dentro de la expresión regular
/KeywordB/: (/w)/
Esto coincide con cualquier palabra que viene después de su palabra clave. Como no mencionó ningún terminador, asumí que solo quería la palabra al lado de la palabra clave.
Avíseme si debería eliminar la publicación anterior, pero tal vez alguien quiera leerla.
La forma de hacer "palabras para buscar" dentro de la expresión regular es la siguiente:
regex = @"(Key1|Key2|Key3|LastName|FirstName|Etc):"
Lo que está haciendo probablemente no valga la pena en una expresión regular, aunque probablemente se pueda hacer de la manera que quiera (aunque todavía no está 100% claro en los requisitos). Implica mirar hacia adelante para el próximo partido y detenerse en ese punto.
Aquí hay una re-escritura como un código regular regular de expresiones regulares que debería hacer el truco. No le importan los espacios, por lo que si solicita "Key2" como se muestra a continuación, lo separará del valor.
string[] keys = {"Key1", "Key2", "Key3"};
string source = "Key1:Value1Key2: ValueAnd A: To Test Key3: Something";
FindKeys(keys, source);
private void FindKeys(IEnumerable<string> keywords, string source) {
var found = new Dictionary<string, string>(10);
var keys = string.Join("|", keywords.ToArray());
var matches = Regex.Matches(source, @"(?<key>" + keys + "):",
RegexOptions.IgnoreCase);
foreach (Match m in matches) {
var key = m.Groups["key"].ToString();
var start = m.Index + m.Length;
var nx = m.NextMatch();
var end = (nx.Success ? nx.Index : source.Length);
found.Add(key, source.Substring(start, end - start));
}
foreach (var n in found) {
Console.WriteLine("Key={0}, Value={1}", n.Key, n.Value);
}
}
Y el resultado de esto es:
Key=Key1, Value=Value1
Key=Key2, Value= ValueAnd A: To Test
Key=Key3, Value= Something