Estrai unità separate da virgola dal codice sorgente utilizzando RegEx

Aug 20 2020

Voglio usare le espressioni regolari per estrarre informazioni dal mio codice sorgente. Potete aiutarmi a costruire una RegEx che recuperi le unità utilizzate sul codice sorgente?.

Esempio di codice sorgente:

unit ComandesVendes;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Manteniment;

type
  TFComandesVendes = class(TFManteniment,ActualitzacioFinestra)
    QRCapsaleraNumero: TIntegerField;
    QRCapsaleraData: TDateTimeField;
    QRCapsaleraDataEntrega: TDateTimeField;
...
...     

Ho bisogno di ottenere i nomi dei file separati da virgole dalla usesclausola fino al successivo ;. In quell'esempio l'output deve essere:

Windows
Messages
SysUtils
Variants
Classes
Graphics
Controls
Forms
Dialogs
Manteniment

Sto provando qualcosa del genere

^ *uses(\n* *(\w*),)* *\n* *(\w*) *;

Corrisponde alla clausola uses, ma non restituisce ciascun nome di file separatamente.

Grazie.

Risposte

6 Thefourthbird Aug 20 2020 at 18:19

In questa pagina si dice che Delphi utilizza il sapore regex PCRE.

In tal caso, un'opzione consiste nell'utilizzare un gruppo di acquisizione in combinazione con l' \Gancora.

(?:^ *uses\r?\n *|\G(?!^))(\w+)(?:,\s*|;$)

Spiegazione

  • (?:Gruppo non di cattura
    • ^ *uses\r?\n *Abbina gli spazi facoltativi dall'inizio della stringa, quindi abbina e una nuova riga seguita di nuovo da spazi facoltativi
    • |O
    • \G(?!^)Asserire la posizione alla fine della partita precedente, non all'inizio (l' \Gancora corrisponde a 2 posizioni, all'inizio della stringa o alla fine della partita precedente)
  • )Chiudi gruppo non di acquisizione
  • (\w+)Cattura gruppo 1 Abbina 1+ caratteri di parola
  • (?:,\s*|;$)Gruppo non di acquisizione, corrisponde a una virgola e 0+ caratteri spazi bianchi o corrisponde ;alla fine della stringa.

Dimostrazione regolare