次の正規表現を適用しようとすると、問題に直面しています。
(1234).*?(abcd)?
以下の文字列に:
1234567abcd
私の期待は、上記が2つの一致を生成するはずです:
- 1234
- あいうえお
ただし、これは機能しません。「まあ、末尾の?
文字を削除するだけですか?」と提案するかもしれません。-- しかし、私はこの 2 番目のパターンをオプションにしたいと考えています。
これはどのように行われますか?
繰り返します:
(1234).*?(abcd)
...目的の結果が得られますが、検索文字列に常に含まれるとは限りませんabcd
。
疑問に思っている人のために説明すると、これは全体像の問題の単純化された例です。必要に応じて説明します。
====
この問題にはさらに説明が必要だと思います。これは、Ruby で私がやろうとしていることのより完全な例です。
私のログファイルから次の 2 つの「ドキュメンテーション」行があるとします。
Aug 28 00:00:05 app-system-1 app-prod[7660]: Completed 200 OK in 150ms (Views: 24.6ms | ActiveRecord: 66.1ms)
Aug 28 00:05:06 app-system-1 app-prod[10639]: Completed 302 Found in 81ms (ActiveRecord: 74.6ms)
次のようにRubyで正規表現をコンパイルしようとしました:
d=Regexp.new('(?<timestamp>\w{1,3}\s\d{1,2}\s\d\d:\d\d:\d\d).*(?<in>in [0-9]*).*(?<views>Views: [0-9]*).*(?<activerecord>ActiveRecord: [0-9]*)')
明らかに、「ビュー」テキストが含まれる場合もありますが、他の行には存在しません。
私は次のようなことができるようにしたい:
v=d.match(line)
if !v.nil?
puts v[:timestamp]+ " " + v[:in] + " " + v[:views] + " " + v[:activerecord]
これは明らかに不完全な例ですが、これで明確になることを願っています。