1

preg_match_allからログを処理するために使用しようとしていますgit log --pretty=raw --all

私が得たサンプルデータは次のようなものです:

commit 5650c7841f72c4c65689b0d4bc83ccd70e5b2362 (HEAD, origin/master, origin/HEAD, master)
tree 69c6036c64c805e9c335b2eadd87b43af90ee1ad
parent a912fdd530efe69dae4b0f417c8a8631d68f469c
parent 113e128efe54511f2b0bdd589301ffe039fc185e
author Author Name 3 <author.name.3@gmail.com> 1371835063 -0700
committer Committer Name 3 <committer.name.3@gmail.com> 1371835063 -0700

    Merge pull request #60 from sample/master

    Line 2 message

commit 94e99889226671dc479be770968df2692e09db11 (origin/fixit)
tree f900c172fa633b3769b982614ce639e3ee6f3b62
parent dc56687f1597b317064b0d899c2450fb6805791e
author Author Name 2 <author.name.2@something.com.tld> 1370944188 +0300
committer Committer Name 2 <committer.name.2@something.com.tld> 1370944188 +0300

    1 line message

commit dc56687f1597b317064b0d899c2450fb6805791e
tree cb1573ccde7ddcb2e54b9b9a777e11a435d532ac
parent a912fdd530efe69dae4b0f417c8a8631d68f469c
author Author Name 1 <author.name.1@gmail.com> 1370640640 +0300
committer Committer Name 1 <committer.name.1@gmail.com> 1370943413 +0300

    Message contain words like commit tree parent author committer to screw your regex.
    Also contain other symbols like @ # ! % ( ) = - |

    Can you handle 2nd paragraph?

    3rd paragraph?

`

を抽出したいと思います

  • コミット ハッシュ
  • ツリーハッシュ
  • 親のハッシュ
  • 著者名
  • コミッター、そして
  • コミットメッセージ

私が得ることができる最も近いものは次のとおりです。

/^commit (.{40})(.*)\s^tree (.{40})\s^parent (.{40})\s(^parent (.{40})\s)?^author (.+)\s^committer (.+)\s+(.+)\s+/m

次のようなものが出てきます: http://regex101.com/r/cY4qV4

私のように簡単に壊れない上記のデータのより正確な正規表現はありますか?

注意事項:

  1. タグ、コミット後の () 内の分岐 (追加の質問: 1 つの正規表現内でもタグ/分岐をコンマ (,) で区切ることは可能ですか?)
  2. 一部のコミットには 2 つの親があります
  3. コミットメッセージには、複数の段落、奇妙な記号、または正規表現で使用する単語が含まれている場合があります
4

1 に答える 1