使用 RegEx 从源代码中提取逗号分隔的单位

Mar*_*lot 3 regex delphi delphi-10.3-rio

我想使用正则表达式从我的源代码中提取信息。你能帮我构建一个正则表达式来检索源代码中使用的单位吗?。

源代码示例:

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;
...
...     
Run Code Online (Sandbox Code Playgroud)

我需要从uses子句到下一个;. 在该示例中,输出必须是:

Windows
Messages
SysUtils
Variants
Classes
Graphics
Controls
Forms
Dialogs
Manteniment
Run Code Online (Sandbox Code Playgroud)

我正在尝试类似的东西

^ *uses(\n* *(\w*),)* *\n* *(\w*) *;
Run Code Online (Sandbox Code Playgroud)

它匹配 uses 子句,但它不会分别返回每个文件名。

谢谢你。

The*_*ird 6

此页面上,它说 Delphi 使用 PCRE 正则表达式风格。

在这种情况下,一种选择是将捕获组与\G锚点结合使用。

(?:^ *uses\r?\n *|\G(?!^))(\w+)(?:,\s*|;$)
Run Code Online (Sandbox Code Playgroud)

解释

  • (?: 非捕获组
    • ^ *uses\r?\n * 匹配字符串开头的可选空格,然后再次匹配换行符和可选空格
    • | 或者
    • \G(?!^)断言在上一场比赛结束时的位置,而不是在开始处(\G锚点匹配 2 个位置,要么在字符串的开头,要么在上一场比赛的末尾)
  • ) 关闭非捕获组
  • (\w+)捕获组 1匹配 1+ 个单词字符
  • (?:,\s*|;$)非捕获组,匹配逗号和 0+ 空格字符或匹配;字符串末尾。

正则表达式演示