Regex en .NET:uso de grupos de captura con nombre para extraer datos

 C Programming >> Programación C >  >> Tags >> .NET
Regex en .NET:uso de grupos de captura con nombre para extraer datos

En expresiones regulares, la captura de grupos le brinda una forma de guardar texto y consultarlo más tarde. Los grupos de captura se pueden nombrar y hacer referencia a ellos por su nombre. Cuando no se nombran, se hace referencia a ellos por su número de índice.

En este artículo, mostraré cómo usar grupos de captura con nombre resolviendo el problema de extraer datos de las partes destacadas de Kindle de un libro que acabo de terminar de leer.

1 – Obtener los datos sin procesar

En primer lugar, aquí hay un fragmento de algunos aspectos destacados. Obtuve esto del sitio web de Amazon Kindle Highlights.

Your Kindle Notes For:
Fooled by Randomness: The Hidden Role of Chance in Life and in the Markets (Incerto Book 1)
Nassim Nicholas Taleb
Last accessed on Monday March 2, 2020
 Note(s)


Yellow highlight | Page: 243
You attribute your successes to skills, but your failures to randomness.
                

Yellow highlight | Page: 248
A more human version can be read in Seneca’s Letters from a Stoic, a soothing and surprisingly readable book that I distribute to my trader friends (Seneca also took his own life when cornered by destiny).
                

Yellow highlight | Page: 249
Self-help books (even when they are not written by charlatans) are largely ineffectual.
                

Yellow highlight | Page: 249
The only article Lady Fortuna has no control over is your behavior. Good luck.Code language: plaintext (plaintext)

2 – Determina qué datos quieres extraer

Quiero el número de página y el texto resaltado.

Por ejemplo, quiero convertir esta línea:

Yellow highlight | Page: 249
The only article Lady Fortuna has no control over is your behavior. Good luck.Code language: plaintext (plaintext)

En esto:

Página Texto
249 El único artículo sobre el que Lady Fortuna no tiene control es tu comportamiento. Buena suerte.

3 – Escribe la expresión regular

Siempre uso .NET Regex Tester para escribir expresiones regulares y probarlas rápidamente.

Aquí está la expresión regular para extraer la página y el texto de los datos destacados.

Explicando esta expresión regular

Voy a desglosar y explicar la declaración de expresiones regulares anterior.

\w+ highlight \| (Location|Page): Code language: plaintext (plaintext)

El propósito de esto es encontrar el inicio de cada resaltado.

Regex Explicación
\w+ resaltar Coincide con uno o más caracteres alfanuméricos seguidos del literal "resaltado".

Podría haber especificado los colores en lugar de hacer coincidir cualquier palabra, como esta (Azul|Amarillo), pero usé \w+ en su lugar porque no quiero tener que arreglar esto si Kindle agrega más colores.
\| Coincide con un carácter de barra vertical “|”. Esto tiene que ser escapado con "\" porque "|" es un operador en expresiones regulares.
(Ubicación|Página): Coincide con la palabra "Ubicación:" o "Página:". He visto ambos en los aspectos destacados de Kindle.

Ahora que se conoce el inicio de cada bloque destacado, la segunda parte de la expresión regular se usa para capturar los datos que quiero extraer del bloque destacado.

(?<page>[0-9,])\r\nCode language: plaintext (plaintext)
Regex Explicación
() Grupo de captura. Todo lo que esté entre paréntesis forma parte del grupo capturado y se puede hacer referencia a él más adelante.
? Nombra a este grupo de captura "página". Este grupo puede ser referenciado por el nombre “página” más adelante.
[0-9,] Coincide con dígitos y comas. Ej:99, 100, 1000
\r\n Coincide con una nueva línea de Windows.
(?<highlight>.*)Code language: plaintext (plaintext)
Regex Explicación
() Grupo de captura
? Nombra al grupo de captura "destacado".
.* Coincide con todo

4 – Usa la expresión regular en el código

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace RegexCapturingGroups
{
    public class KindleHighlight
    {
        public int Page { get; set; }
        public string Text { get; set; }
    }
    public class KindleHighlightParser
    {
        private static readonly Regex regex = new Regex(@"\w+ highlight \| (Location|Page): (?<page>[0-9,]+)\r\n(?<highlight>.*)", RegexOptions.Compiled);
        public List<KindleHighlight> ParseHighlights(string rawHighlightData)
        {
            var kindleHighlights = new List<KindleHighlight>();

            foreach (Match match in regex.Matches(rawHighlightData))
            {
                kindleHighlights.Add(new KindleHighlight()
                {
                    Page = Convert.ToInt32(match.Groups["page"].Value),
                    Text = match.Groups["higlight"].Value

                });
            }

            return kindleHighlights;
        }
    }
}

Code language: C# (cs)