Извлеките единицы, разделенные запятыми, из исходного кода с помощью RegEx

Aug 20 2020

Я хочу использовать регулярные выражения для извлечения информации из исходного кода. Можете ли вы помочь мне создать RegEx, которое извлекает единицы, используемые в исходном коде?

Пример исходного кода:

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;
...
...     

Мне нужно получить имена файлов, разделенных запятыми, с момента usesпредложения до следующего ;. В этом примере результат должен быть:

Windows
Messages
SysUtils
Variants
Classes
Graphics
Controls
Forms
Dialogs
Manteniment

Я пробую что-то вроде

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

Он соответствует предложению uses, но не возвращает каждое имя файла отдельно.

Спасибо.

Ответы

6 Thefourthbird Aug 20 2020 at 18:19

На этой странице говорится, что Delphi использует разновидность регулярных выражений PCRE.

В этом случае один из вариантов - использовать группу захвата в сочетании с \Gпривязкой.

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

Объяснение

  • (?: Группа без захвата
    • ^ *uses\r?\n * Сопоставьте необязательные пробелы с начала строки, затем сопоставьте и новую строку, за которой снова следует необязательные пробелы
    • | Или же
    • \G(?!^)Утверждать позицию в конце предыдущего совпадения, а не в начале ( \GЯкорь совпадает в 2 позициях, либо в начале строки, либо в конце предыдущего совпадения)
  • ) Закрыть группу без захвата
  • (\w+)Группа захвата 1 Соответствует 1+ словосочетанию
  • (?:,\s*|;$)Группа без захвата, соответствует либо запятой и 0+ пробелам, либо соответствует ;в конце строки.

Демо Regex