0

PRCE Regex を使用して、さまざまな 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 に答える