我在这里有两个字符串a
和b
:
irb(main):022:0> a
=> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:44,848 pid 10101 tid 139953357145856 INFO env Using"
irb(main):023:0> b
=> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:45,712 pid 10101 tid 139953357145856 ERROR env Using"
我想写一个可以忽略a
并匹配b
的正则表达式。
在字符串a
中,':error'后跟'INFO'。
在第二个字符串b
中,':error'后跟'ERROR'
我试过这个
a.match(".*error.*(?!INFO).*")
但正则表达式将返回a
和b
使用match
是必须的,因为我正在尝试将正则表达式传递给sensu脚本(https://github.com/sensu/sensu-community-plugins/blob/master/plugins/logging/check-log.rb#L189)
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以匹配错误'两次而不是。
a.match(".*error.*ERROR.*")
正如Cary Swoveland所指出的,这也将匹配包含" ERROR"的INFO日志条目。如下所示,字符串在里面:
irb(main):035:0> "error INFO ERROR".match(".*error.*ERROR.*")
=> #<MatchData "error INFO ERROR">
irb(main):036:0> "error ERROR INFO".match(".*error.*ERROR.*") # <-- HERE
=> #<MatchData "error ERROR INFO">
irb(main):037:0> "error INFO Praesent quis nisl posuere.".match(".*error.*ERROR.*")
=> nil
初始regexp
- 包含INFO字符串的跳过错误也会发生这种情况,如下所示:
irb(main):048:0> "error INFO ERROR".match(".*error(?!.*INFO).*")
=> nil
irb(main):049:0> "error ERROR INFO".match(".*error(?!.*INFO).*")
=> nil
irb(main):050:0> "error INFO Praesent quis nisl posuere.".match(".*error(?!.*INFO).*")
=> nil
为避免跳过或匹配错误的日志条目,我会依赖该字符串的更多部分。
为此,获取两个初始样本,我会依赖时间戳,检查出来:
irb(main):055:0> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:44,848 pid 10101 tid 139953357145856 INFO env Using ERROR".match(".*error(?!.*[0-9] INFO).*")
=> nil
irb(main):056:0> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:44,848 pid 10101 tid 139953357145856 INFO env Using ERROR".match(".*error(?!.*[0-9] INFO).*")
=> nil
irb(main):057:0> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:45,712 pid 10101 tid 139953357145856 ERROR env Using INFO".match(".*error(?!.*[0-9] INFO).*")
=> #<MatchData "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:45,712 pid 10101 tid 139953357145856 ERROR env Using INFO">
irb(main):058:0> "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:45,712 pid 10101 tid 139953357145856 ERROR env Using INFO".match(".*error(?!.*[0-9] INFO).*")
=> #<MatchData "[:error] [pid 10101:tid 139953357145856] 2015-03-15 20:33:45,712 pid 10101 tid
所以,我的最终版本是:".*error(?!.*[0-9] INFO).*"
。