2017-06-21 77 views
1

我需要在我的日誌(meassage1)中選擇沒有[的字母。Ruby正則表達式選擇無[

我的日誌:

[LogMessage:INFO:[sm-Server-02110] Product=PolicyServer,Platform=Linux 2.6.32-573.8.1.el6.x86_64,Version=12.52,Update=01.01,Label=640,Crypto=128,UTC=1456285048,TZ=0][] 

我正則表達式:

\[(?<message1>\S+)\]\s(?<message2>.*)\]\[(?<data>[^\]]*)\]$ 

匹配:

message1 LogMessage:INFO:[sm-Server-02110 
message2 Product=PolicyServer,Platform=Linux 2.6.32-573.8.1.el6.x86_64,Version=12.52,Update=01.01,Label=640,Crypto=128,UTC=1456285048,TZ=0 
data 

參考ENCE:http://rubular.com/r/urCvQMdRlB

我需要匹配結果message1 LogMessage:INFO:sm-Server-02110而不是message1 LogMessage:INFO:[sm-Server-02110

我嘗試以下方法:

\[(?<message1>[^[].*)\]\s(?<message2>.*)\]\[(?<data>[^\]]*)\]$ 

但其拋焦炭類過早結束。

建議我如何選擇無值選擇此選項。

+5

剛剛從'message1'之後您刪除它得到比賽。沒有辦法將不連續的部分文本捕獲到1組中。 –

+2

另一種方法是將'LogMessage:INFO:'和'sm-Server-02110'分別進行匹配,然後將它們連接起來。 – mudasobwa

+0

@mudasobwa:如果你有時間,請發表一個答案來表明這種方法。或者也許兩個。 –

回答

4

以下答案由WiktorStribiżew在評論中的請求發佈。

無法將不連續的部分文本捕獲到1組中。因此,我們有兩種不同的可能性:

1.(由Wiktor的Stribiżew):

input = "[LogMessage:INFO:[sm-Server-02110] Product=Policy" 
input =~ /^\[(?<message1>\S+)\]\s(?<message2>.*)$/ 
[$~[:message1].delete('['), $~[:message2]] 
#⇒ [ 
# [0] "LogMessage:INFO:sm-Server-02110", 
# [1] "Product=Policy" 
# ] 

2.(由mudasobwa):

input =~ /^\[(?<message1_1>.+?)\[(?<message1_2>.+?)\]\s(?<message2>.*)$/ 
[$~[:message1_1] + $~[:message1_2], $~[:message2]] 
#⇒ [ 
# [0] "LogMessage:INFO:sm-Server-02110", 
# [1] "Product=Policy" 
# ]