2014-07-07 37 views
1

我有我的輸入如下,僅匹配匹配塊(如果起始字匹配塊之前出現無視)

輸入

StatusMsg: 
seqId: 14043 
timestamp: 140707 
dId: "Sa01" 
msgType: SEQUENCE 
eventType: UPDATE_CMD 
devContext { 
    context: IDLE 
    operationalMode: 1 
    logHistory { 
     start: 1404387563607 
     end: 1404387563616 
    } 
} 
manifest { 
    timestamp: 1404387733059 
    dev { 
     dId: "Sa01" 
     mainComponent { 
     serialNum: "10001" 
     deviceClass: "Sap" 
     componentType: "Sa01" 
     subcomponentNum: 1 
     } 
    } 
    info { 
     name: "Sa01" 
     channels: 1 
     lib { 
     name: "l.bin" 
     timestamp: 1404387733059 
     version: "6870711ee" 
     validStartDate: 1404387733059 
     } 
     activeSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "12.001" 
     validStartDate: 1404387733059 
     } 
     activeCSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "03.001" 
     validStartDate: 1404387733059 
     } 
    } 
} 
powerStatus { 
    powerEvent: ON 
    powerSource: AC 
    chargerStatus: CHARGING 
    batteryStatus: GOOD 
} 
status { 
    msgHeader { 
     messageId: 13 
     timestamp: 1404387733059 
     seqNum: 13 
     sourceId: 13 
     numOfParams: 0 
    } 
    infuserState: READY 
    keypadLockout: UNLOCKED 
} 
cmdResponse { 
    cmdType: A_PGM 
    aPgm { 
     dId: "Sa01" 
     refId: 79 
     request { 
     refId: 79 
     libId: "6870711eedb" 
     channelId: 1 
     lId: 1 
     pgmType: FULL 
     aPgmType: NEW 
     externalId: "EXT_ID_9" 
     stats { 
      WG: 76230 
      HG: 150500 
      BS: 1790 
     } 
     multi: false 
     } 
     response { 
     dId: "Sa01" 
     files: 1.bin 
     major: 338013710701 
     status: Received 
     } 
    } 
} 
[2014-07-07 14:10:41.034] I/O Received 
StatusMsg: 
seqId: 14043 
timestamp: 140707 
dId: "Sa01" 
msgType: SEQUENCE 
eventType: UPDATE_CMD 
devContext { 
    context: IDLE 
    operationalMode: 1 
    logHistory { 
     start: 1404387563607 
     end: 1404387563616 
    } 
} 
manifest { 
    timestamp: 1404387733059 
    dev { 
     dId: "Sa01" 
     mainComponent { 
     serialNum: "10001" 
     deviceClass: "Sap" 
     componentType: "Sa01" 
     subcomponentNum: 1 
     } 
    } 
    info { 
     name: "Sa01" 
     channels: 1 
     lib { 
     name: "l.bin" 
     timestamp: 1404387733059 
     version: "6870711ee" 
     validStartDate: 1404387733059 
     } 
     activeSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "12.001" 
     validStartDate: 1404387733059 
     } 
     activeCSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "03.001" 
     validStartDate: 1404387733059 
     } 
    } 
} 
powerStatus { 
    powerEvent: ON 
    powerSource: AC 
    chargerStatus: CHARGING 
    batteryStatus: GOOD 
} 
status { 
    msgHeader { 
     messageId: 13 
     timestamp: 1404387733059 
     seqNum: 13 
     sourceId: 13 
     numOfParams: 0 
    } 
    infuserState: READY 
    keypadLockout: UNLOCKED 
} 
cmdResponse { 
    cmdType: A_PGM 
    aPgm { 
     dId: "Sa01" 
     refId: 79 
     request { 
     refId: 79 
     libId: "6870711eedb" 
     channelId: 1 
     lId: 1 
     pgmType: FULL 
     aPgmType: NEW 
     externalId: "EXT_ID_9" 
     stats { 
      WG: 76230 
      HG: 150500 
      BS: 1790 
     } 
     multi: false 
     } 
     response { 
     dId: "Sa01" 
     files: 1.bin 
     major: 35723057325 
     status: Valid 
     } 
    } 
} 
[2014-07-07 14:15:71.028] I/O Received 
StatusMsg: 
seqId: 14043 
timestamp: 140707 
dId: "Sa01" 
msgType: SEQUENCE 
eventType: UPDATE_CMD 
devContext { 
    context: IDLE 
    operationalMode: 1 
    logHistory { 
     start: 1404387563607 
     end: 1404387563616 
    } 
} 
manifest { 
    timestamp: 1404387733059 
    dev { 
     dId: "Sa01" 
     mainComponent { 
     serialNum: "10001" 
     deviceClass: "Sap" 
     componentType: "Sa01" 
     subcomponentNum: 1 
     } 
    } 
    info { 
     name: "Sa01" 
     channels: 1 
     lib { 
     name: "l.bin" 
     timestamp: 1404387733059 
     version: "6870711ee" 
     validStartDate: 1404387733059 
     } 
     activeSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "12.001" 
     validStartDate: 1404387733059 
     } 
     activeCSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "03.001" 
     validStartDate: 1404387733059 
     } 
    } 
} 
powerStatus { 
    powerEvent: ON 
    powerSource: AC 
    chargerStatus: CHARGING 
    batteryStatus: GOOD 
} 
status { 
    msgHeader { 
     messageId: 13 
     timestamp: 1404387733059 
     seqNum: 13 
     sourceId: 13 
     numOfParams: 0 
    } 
    infuserState: READY 
    keypadLockout: UNLOCKED 
} 
cmdResponse { 
    cmdType: A_PGM 
    aPgm { 
     dId: "Sa01" 
     refId: 79 
     request { 
     refId: 79 
     libId: "6870711eedb" 
     channelId: 1 
     lId: 1 
     pgmType: FULL 
     aPgmType: NEW 
     externalId: "EXT_ID_9" 
     stats { 
      WG: 76230 
      HG: 150500 
      BS: 1790 
     } 
     multi: false 
     } 
     response { 
     dId: "Sa01" 
     files: 1.bin 
     major: 27151510570 
     status: Accepted 
     } 
    } 
} 
[2014-07-07 14:15:51.034] I/O Received 
StatusMsg: 
seqId: 14043 
timestamp: 140707 
dId: "Sa01" 
msgType: SEQUENCE 
eventType: UPDATE_CMD 
devContext { 
    context: IDLE 
    operationalMode: 1 
    logHistory { 
     start: 1404387563607 
     end: 1404387563616 
    } 
} 
manifest { 
    timestamp: 1404387733059 
    dev { 
     dId: "Sa01" 
     mainComponent { 
     serialNum: "10001" 
     deviceClass: "Sap" 
     componentType: "Sa01" 
     subcomponentNum: 1 
     } 
    } 
    info { 
     name: "Sa01" 
     channels: 1 
     lib { 
     name: "l.bin" 
     timestamp: 1404387733059 
     version: "6870711ee" 
     validStartDate: 1404387733059 
     } 
     activeSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "12.001" 
     validStartDate: 1404387733059 
     } 
     activeCSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "03.001" 
     validStartDate: 1404387733059 
     } 
    } 
} 
powerStatus { 
    powerEvent: ON 
    powerSource: AC 
    chargerStatus: CHARGING 
    batteryStatus: GOOD 
} 
status { 
    msgHeader { 
     messageId: 13 
     timestamp: 1404387733059 
     seqNum: 13 
     sourceId: 13 
     numOfParams: 0 
    } 
    infuserState: READY 
    keypadLockout: UNLOCKED 
} 
cmdResponse { 
    cmdType: A_PGM 
    aPgm { 
     dId: "Sa01" 
     refId: 79 
     request { 
     refId: 79 
     libId: "6870711eedb" 
     channelId: 1 
     lId: 1 
     pgmType: FULL 
     aPgmType: NEW 
     externalId: "EXT_ID_9" 
     stats { 
      WG: 76230 
      HG: 150500 
      BS: 1790 
     } 
     multi: false 
     } 
     response { 
     dId: "Sa01" 
     files: 1.bin 
     major: 35723057325 
     status: Valid 
     } 
    } 
} 

我要保證以下是強制性存在於與相同的順序輸入,

StatusMsg: 
dId: "Sa01" 
eventType: UPDATE_CMD 
cmdResponse 
cmdType: A_PGM 
response 
dId: "Sa01" 
status: Accepted 

的預期輸出

StatusMsg: 
seqId: 14043 
timestamp: 140707 
dId: "Sa01" 
msgType: SEQUENCE 
eventType: UPDATE_CMD 
devContext { 
    context: IDLE 
    operationalMode: 1 
    logHistory { 
     start: 1404387563607 
     end: 1404387563616 
    } 
} 
manifest { 
    timestamp: 1404387733059 
    dev { 
     dId: "Sa01" 
     mainComponent { 
     serialNum: "10001" 
     deviceClass: "Sap" 
     componentType: "Sa01" 
     subcomponentNum: 1 
     } 
    } 
    info { 
     name: "Sa01" 
     channels: 1 
     lib { 
     name: "l.bin" 
     timestamp: 1404387733059 
     version: "6870711ee" 
     validStartDate: 1404387733059 
     } 
     activeSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "12.001" 
     validStartDate: 1404387733059 
     } 
     activeCSW { 
     name: "Sa01" 
     timestamp: 1404387733059 
     version: "03.001" 
     validStartDate: 1404387733059 
     } 
    } 
} 
powerStatus { 
    powerEvent: ON 
    powerSource: AC 
    chargerStatus: CHARGING 
    batteryStatus: GOOD 
} 
status { 
    msgHeader { 
     messageId: 13 
     timestamp: 1404387733059 
     seqNum: 13 
     sourceId: 13 
     numOfParams: 0 
    } 
    infuserState: READY 
    keypadLockout: UNLOCKED 
} 
cmdResponse { 
    cmdType: A_PGM 
    aPgm { 
     dId: "Sa01" 
     refId: 79 
     request { 
     refId: 79 
     libId: "6870711eedb" 
     channelId: 1 
     lId: 1 
     pgmType: FULL 
     aPgmType: NEW 
     externalId: "EXT_ID_9" 
     stats { 
      WG: 76230 
      HG: 150500 
      BS: 1790 
     } 
     multi: false 
     } 
     response { 
     dId: "Sa01" 
     files: 1.bin 
     major: 27151510570 
     status: Accepted 
     } 
    } 
} 

我試圖與正則表達式,

(StatusMsg:.*?dId:\s*"Sa01".*?eventType: UPDATE_CMD.*?response\s*{[\s\n\w\.:]*dId:\s*"Sa01"[\s\n\w\.:]*status:\s*Accepted) 

上述表達式從第一StatusMsg選擇直到接受。任何人都可以幫助構建正確的正則表達式嗎?

回答

1

你只需要對你的正則表達式做一些小的改動就可以做到這一點。請注意,使用您的正則表達式,最後還需要標記m

更新的正則表達式:

/(StatusMsg:(?!.*StatusMsg:).*?dId:\s*"Sa01".*?eventType: UPDATE_CMD.*?response\s*{[\s\n\w\.:]*dId:\s*"Sa01"[\s\n\w\.:]*status:\s*Accepted)/m 

注:對於rubular測試,剝去/在開始和/m末,並把m的小文本框到一個地方的權利你正在輸入你的正則表達式。這將設置要應用的m標誌,這會在您的正則表達式中導致.匹配換行符(而不是默認行爲)。

所更改的唯一的事情還有就是

StatusMsg:.*?

已成爲

StatusMsg:(?!.*StatusMsg:).*?

這工作負向前看符號。這實際上是告訴你的正則表達式只匹配你的正則表達式匹配的地方,但只有當匹配不包含兩個字符串StatusMsg

如果StatusMsg總是在沒有前面的空白行的開始,你可以把這個稍微做具體:

^StatusMsg:(?!.*^StatusMsg:).*?

+0

謝謝你的解決方案。只有匹配的部分位於輸入的最後部分,您的解決方案纔有效。我修改了輸入,以便我的預期匹配不是最後一組消息。你能幫我選擇當前輸入的預期匹配嗎? – MIZ

+0

嗯。還沒有提出一個純粹的正則表達式解決方案;但是你可以通過'input_str.split(/^StatusMsg /)'讓自己更容易,然後遍歷數組中返回的對象,搜索你想要的模式。 – bdx

+0

任何人都得到了這個問題的答案 – MIZ