【问题标题】:Negative lookahead matches from the previous match上一场比赛的负前瞻比赛
【发布时间】:2015-09-16 21:43:46
【问题描述】:
signals.Signals$MsgSig:
cmdResponse {
ap {
.....
req {
   Id: 192
.......
}
res {
Status: Received
.........
Id: 192
.........
}
...
}
....
}
sysContainer
signals.Signals$MsgSig:
cmdResponse {
ap {
.....
req {
Id: 192
.......
}
res {
Status: VALID
.........
Id: 192
.........
}
...
}
....
}
sysContainer
signals.Signals$MsgSig:
cmdResponse {
ap {
.....
req {
   Id: 193
.......
}
res {
Status: Received
.........
Id: 193
.........
}
...
}
....
}
sysContainer
signals.Signals$MsgSig:
cmdResponse {
ap {
.....
req {
Id: 193
.......
}
res {
Status: VALID
.........
Id: 193
.........
}
...
}
....
}
sysContainer

我正在尝试对搜索实施负前瞻。 Signal 从 Signals$MsgSig: 开始,到 sysContainer 结束。我需要根据 IdValue 和 Status 进行过滤。

Status = "VALID"
IdValue = "193"
aFile     = File.read('C:\Users\Documents\Application.log')

 aFile.match(/(?x)Signals\$MsgSig:\n((?!Signals\$MsgSig:).)*?
                             Id:\W+#{IdValue}\n((?!Signals\$MsgSig:).)*?sysContainer\s\{/m).to_s

这里我想获取一个特定的 MsgSig:tat 的 Id 值为 192,状态为有效。在上面的正则表达式中,我应该在哪里添加对“状态”的搜索。

如果我添加如下所示的搜索,它将从第一个 MsgSig 与 IdValue 192 匹配。

     aFile.match(/(?x)Signals\$MsgSig:\n((?!Signals\$MsgSig:).)*?
 Id:\W+#{IdValue}(.*?)autoProgramStatus:\W+#{apStatus}((?! Signals\$MsgSig:).)*?sysContainer\s\{/m).to_s

请让我知道我在这里做错了什么。

【问题讨论】:

    标签: ruby regex negative-lookahead


    【解决方案1】:

    我试过你的代码,我认为你通过添加多余的\{ 弄错了正则表达式。

    aFile.match(/(?x)Signals\$MsgSig:\n((?!Signals\$MsgSig:).)*?Id:\W+#{IdValue}\n((?!Signals\$MsgSig:).)*?sysContainer\s/m).to_s
    
    # => "Signals$MsgSig:\ncmdResponse {\nap {\nreq {\n   Id: 192\n}\nres {\nStatus: Received\nId: 192\n}\n}\n}\nsysContainer\n"
    

    p.s.1

    我认为没有必要使用负前瞻,删除负前瞻部分代码也可以工作。

    aFile.match(/(?x)Signals\$MsgSig:\n(.)*?Id:\W+#{IdValue}\n(.)*?sysContainer\s/m).to_s
    
    # => "Signals$MsgSig:\ncmdResponse {\nap {\nreq {\n   Id: 192\n}\nres {\nStatus: Received\nId: 192\n}\n}\n}\nsysContainer\n"
    

    p.s.2

    要自己解决这个问题,我会这样做

    str = '' # the first block of code of your post
    parts = str.scan(/signals\.Signals\$MsgSig:\n(.*?)\nsysContainer/m).flatten
    # => [
      "cmdResponse {\nap {\nreq {\n   Id: 192\n}\nres {\nStatus: Received\nId: 192\n}\n}\n}",
      "cmdResponse {\nap {\nreq {\nId: 192\n}\nres {\nStatus: VALID\nId: 192\n}\n}\n}",
      "cmdResponse {\nap {\nreq {\n   Id: 193\n}\nres {\nStatus: Received\nId: 193\n}\n}\n}",
      "cmdResponse {\nap {\nreq {\nId: 193\n}\nres {\nStatus: VALID\nId: 193\n}\n}\n}"
    ]
    parts.detect{|s| s.match /(.*)Id: 192(.*)Status: VALID(.*)/m }
    # => "cmdResponse {\nap {\nreq {\nId: 192\n}\nres {\nStatus: VALID\nId: 192\n}\n}\n}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2016-06-05
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多