2015-06-30 6 views
-1
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 

Я пытаюсь реализовать негативный взгляд на поиск. Сигнал начинается с сигналов $ 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 и статус как действительный. В приведенном выше регулярном выражении, где я должен добавить поиск «status».

Если добавить поиск, как показано ниже, он совпадает с первой MsgSig с IdValue 192.

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

Пожалуйста, дайте мне знать, что я делаю неправильно здесь.

ответ

0

Я пробовал свой код, и я думаю, что вы ошиблись в регулярном выражении, добавив избыточный \{.

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}"