如何编写正则表达式以匹配具有单词' error'的字符串。但不是' info'?

时间:2015-03-16 01:53:06

标签: ruby regex

我在这里有两个字符串ab

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).*")  

但正则表达式将返回ab

的匹配项

使用match是必须的,因为我正在尝试将正则表达式传递给sensu脚本(https://github.com/sensu/sensu-community-plugins/blob/master/plugins/logging/check-log.rb#L189

2 个答案:

答案 0 :(得分:2)

前面的.*应放在前瞻断言中......

.*error(?!.*INFO).*

Rubular - 另外,我会考虑使用word boundaries

答案 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).*"