DHCP 租约文件的正则表达式未按预期工作

Regex for DHCP leases file is not working as expected

我正在使用正则表达式模式来匹配 dhcp 租约数据文件。

(?mis)^lease\s+(\S+)(?:(?!^lease\s).)*?binding state\s+(active|inactive|offline|free|abandoned?).*?(\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2});.*?vendor-class\s*(\"[^\"]+\");.*?[^}]

但是上面的正则表达式匹配不正确。例如,如果我有一个格式如下的示例 dhcp.leases 文件。

 lease 000.000.00.001 {
  starts 1 2022/04/25 17:31:27;
  ends 1 2022/04/25 17:33:27;
  cltt 1 2022/04/25 17:31:27;
  binding state free;
  hardware ethernet LL:KK:JJ:HH:DD:SS;
  uid "SDS";
    vendor-class "test1";
  set vendor-class-identifier = "test1";
  client-hostname "MNOP";
}
lease 000.000.00.002 {
  starts 3 2022/04/27 14:41:30;
  ends 3 2022/05/04 14:41:30;
  cltt 3 2022/04/27 14:41:30;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet MM:NN:DD:SS:RR:WW;
  uid "SASa";
  client-hostname "ADBC";
}
lease 000.001.00.003 {
  starts 3 2022/04/20 18:22:44;
  ends 5 2022/05/20 18:22:44;
  cltt 3 2022/04/20 18:22:44;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet AA:BB:CC:DD:FF:FF;
  uid "dasdad";
    vendor-class "test 3 vendor";
  set vendor-class-identifier = "test3";
}

这里在第二个租约中,我没有在正则表达式中使用 vendor-class 文件,所以与其跳过 vendor-class 文件,不如在第三个租约中尝试匹配相同的文件租约,因此我只得到 2 个匹配组而不是 3 个匹配组。将第二和第三租约合并为一个租约。请帮帮我。 请找到下面的 link 以便更好地理解: https://regex101.com/r/dFCWk1/1

您可以使用

(?mis)^lease\s+(\S+)(?:(?!^lease\s).)*?binding state\s+(active|inactive|offline|free|abandoned?)(?:(?!^lease\s).)*?(\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})(?:(?:(?!^lease\s).)*?vendor-class\s*(\"[^\"]+\").*?\s*(\"[^\"]+\");)?[^}]*

regex demo

详情:

  • (?:(?!^lease\s).)*? 替换所有 .*?,以避免比赛期间出现部分溢出
  • 确保供应商匹配模式部分是可选的,请参阅 (?:(?:(?!^lease\s).)*?vendor-class\s*(\"[^\"]+\").*?\s*(\"[^\"]+\");)? 模式,其中 (?:(?!^lease\s).)*?vendor-class\s*(\"[^\"]+\").*?\s*(\"[^\"]+\"); 包含可选的 non-capturing 组(请参阅 How do I make part of a regex match optional?