2016-04-29 15 views
1

以下は、特定の文字列の後に単語を取得するためのコンテンツです:正規表現は

Timestamp: 24-03-2016 19:59:11 
Title:GetData() 
Message: Received request to get data 
Machine: LTPN 

---------------------------------------- 
Timestamp: 24-03-2016 20:15:34 
Title:GetData() 
Message: ERROR [08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. 
ERROR [01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). 
ERROR [01S00] [Microsoft][ODBC SQL Server Driver]Invalid connection string attribute 
Machine: LTPN 

---------------------------------------- 

私は「のGetData()」、「データを取得するために、受信した要求」である、コロン(:)の後に言葉をキャプチャする必要があり、 "LTPN"。誰かが私を助けてくれることを願っています。

以下の正規表現を使用することで、私は望ましくないフルラインデータを取得します。

^\s*Title:.+ gives "Title:GetData()" 
^\s*Message:.+ gives "Message: Received request to get data" 
^\s*Machine:.\S+ gives "Machine: LTPN" 

しかし、私は次のように出力したい:

GetData() 
Received request to get data 
LTPN 
+0

このテキストをどのように解析していますか(Javaなどの言語やメモ帳++などのツール) –

+0

私が理解したところから** [this](https://regex101.com/r/jR4sZ3/1)** – rock321987

+0

のようなツールが必要なのかもしれません。彼のツールは否定的な先読みをサポートしていない可能性があります。 RHSを抽出する。 –

答えて

0

が背後にある外観を使用してみてくださいを...

(?<=Title:).* 

それとも、すべてのコロンの後に値をしたいように見える - >

(?<=^.*:).* 
+0

私はgrokフィルタでこの正規表現を使用すると、動作しません。 –

+0

grokフィルタについてよく分かりませんが、(?<= \ b。*:)。* \ b(?:\(\))を試してみてください。 – TwistedStem

+0

ああ、私はちょうどlogstashとgrokフィルタに関するいくつかのドキュメントを見つけました... \ bはバックスペースであり、伝統的な "最初または最後の文字はありません" – TwistedStem

0

pをキャプチャするには括弧を使用してくださいあなたがしたいアート、 ^\s*Message:(.+)それはReceived request to get data

または

/^\s*\w+:(.+)/gm 

は、より一般的になり戻り、一度に複数のライン上で動作します。

+0

私はgrokフィルタでこの正規表現を使用すると動作しません。 –

0

私はあなたが必要と推測:

Title:(.*?)\sMessage:\s?(.*?)\sMachine:\s?(.*?)$ 

正規表現の説明:

Title: matches the characters Title: literally (case insensitive) 
1st Capturing group (.*?) 
    .*? matches any character (except newline) 
     Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy] 
\s match any white space character [\r\n\t\f ] 
Message: matches the characters Message: literally (case insensitive) 
\s? match any white space character [\r\n\t\f ] 
    Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy] 
2nd Capturing group (.*?) 
    .*? matches any character (except newline) 
     Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy] 
\s match any white space character [\r\n\t\f ] 
Machine: matches the characters Machine: literally (case insensitive) 
\s? match any white space character [\r\n\t\f ] 
    Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy] 
3rd Capturing group (.*?) 
    .*? matches any character (except newline) 
     Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy] 
$ assert position at end of a line 
g modifier: global. All matches (don't return on first match) 
m modifier: multi-line. Causes^and $ to match the begin/end of each line (not only begin/end of string) 
i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z]) 

Regex101 Demo

+0

私はgrokフィルタでこの正規表現を使用すると動作しません。 –

+0

'grok filter'?以前に言いましたか? –

0

さて、私はlooke dをLogstashのドキュメントで読んで、grokフィルタがoniguruma正規表現を使用することを発見しました。私はドキュメンテーションをもう少し見て、私はあなた自身でもっと仕事をしていると思います。これを試してみてください:

filter { 
    multiline { 
    pattern => "^\Timestamp" 
    what => "previous" 
    negate=> true 
    } 
    grok { 
    match => ["message", "(?m)%{DATESTAMP:Timestamp}\s+%{TITLE}\s+%{MESSAGE}\s+%{MACHINE}"] 
    } 
} 

私は完全に私がLogstashまたはGROKフィルタを使用したことがない、これは私がドキュメントで見たものから、純粋であることを認めるだろう。しかし、matchステートメントのコロンの後の値は、値の前にあるタイトルであり、title、message、machineなどのタイトルにはいくつかの値が含まれているようです。

ご希望の場合はご利用ください。