0

使用 PRCE 正则表达式,我想捕获不同 apache 博客的每个字段。这些日志的结构类似于以下示例:

aaa bbb "cc c" ddd "eee" fff

每个字段由空格分隔。但是字段也可能包含空格,在这种情况下,它们在字段的开头和结尾用引号括起来(“cc c”)。不包含空格的字段在字段的开头和结尾也有引号(“eee”)。

结果应该有每个字段的捕获组,因此对于示例应该是: Group1: aaa Group2: bbb Group3: "cc c" Group4: ddd Group5: "eee" Group6: fff

我的问题是我想要一个万能的解决方案,例如带有量词 - 像这样: (?:((aa|bb|"cc"|dd)\s){1,})

但是这里的量词总是在 aaa 处重复。

非常感谢一个整洁、有效的解决方案。

4

1 回答 1

0

我了解您正在使用 PCRE,问题是您使用什么实际工具来处理正则表达式。

假设您使用 perl 本身,让我们研究一下字段是由什么组成的?

  1. 以可选的双引号开头"
  2. 任何不是双引号的字符
  3. 闭幕式"

在正则表达式中,上面的表达式如下所示:

"?[^"]+"?

然后,您可以选择量化上述内容并指定您拥有的列数:

("?[^"]+"?){1,6}

上面说允许 1 到 6 个这样的字段,问题就变成了如何应用/使用正则表达式?这取决于工具,在 perl 中它可能看起来像:

@groups = $apache_line =~ m/("?[^"]+"?)/g

从这里 $groups[0] 将有 aaa $group[1]: bbb ... $group[5]: fff

上面的工作是因为 m// 运算符在列表上下文中

于 2015-07-15T18:04:57.053 回答