我需要在我的日志 (meassage1) 中选择没有 [ 的字母。
我的日志:
[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
引用: http://rubular.com/r/urCvQMdRlB
我需要匹配结果 message1 LogMessage:INFO:sm-Server-02110
而不是 message1 LogMessage:INFO:[sm-Server-02110
我尝试了以下方式:
\[(?<message1>[^[].*)\]\s(?<message2>.*)\]\[(?<data>[^\]]*)\]$
但是它抛出 char-class 过早结束。
建议我如何在不选择这个的情况下选择值。
最佳答案
下面的答案是根据 Wiktor Stribiżew 的要求在评论中发布的。
无法将文本的非连续部分捕获到一组中。因此,我们有两种不同的可能性:
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"
# ]
关于Ruby 正则表达式选择没有 [,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44669016/