2015-11-17 50 views
1

我想從下面的例子字符串中提取(全部在同一行):正則表達式 - 第幾組

First Note Type[br]03/11/2015   12:51:24   USR123[br]Now is the time for all good men to come to the aid of their country[br]Second Note Type[br]03/11/2015   16:26:03   USR456[br]The quick brown fox jumped over the lazy dog. 

2場比賽5組,每組,如:

比賽1

  • G1 - > '第一注類型'
  • G2 - > '03/11/2015'
  • G3 - > '12:51:24'
  • G4 - > 'USR123'
  • G5 - >「現在是所有好男人的時間來到自己的國家[BR]」

2場

  • G1 - > '的幫助下第二個音符輸入'
  • G2 - > '03/11/2015'
  • G3 - > '16:26:03'
  • G4 - > 'USR456'
  • G5 - > '敏捷的棕色狐狸跳過了懶狗'。

到目前爲止,我只設法使用下面的表達式匹配的第一個4組:

([a-zA-Z\s]+)\\[br\\\]([0-9]+/[0-9]+/[0-9]+)\s+([0-9]+:[0-9]+:[0-9]+)\s+([a-zA-Z0-9]+)\\[br\\] 

不能也得到了五分之一(G5)組,我已經嘗試添加一個(.+)但將導致只有一場比賽,而不是n

任何人都可以指向正確的方向嗎?

回答

0

當您使用(.+)時,它會匹配除換行符以外的一個或多個符號,儘可能多次(因此,它會消耗所有內容直到行尾)。

您可以用下面的正則表達式匹配它:

([a-zA-Z\s]+)\[br]([0-9]+/[0-9]+/[0-9]+)\s+([0-9]+:[0-9]+:[0-9]+)\s+([a-zA-Z0-9]+)\[br]([^[]*(?:\[(?!br])[^[]*)*(?:\[br])?) 

regex demo

我加([^[]*(?:\[(?!br])[^[]*)*(?:\[br])?)一部分。它匹配除[br]以外的所有內容。更詳細的細目:

  • [^[]* - 匹配0或大於[
  • (?:\[(?!br])[^[]*)*其它多個字符 - 匹配0或多個序列...
    • \[(?!br]) - 字面[後面沒有與br]
    • [^[]* - 除[以外的0個或更多字符。
  • (?:\[br])? - 匹配1或者0次字面順序與字符串獲得輸入[br]

結果:

enter image description here

+0

謝謝您的回答,我已經嘗試過了,它幾乎奏效!問題是我需要在「G5」組中包含「[br]」(請參閱​​我的示例M1-G5以「」結尾),我給出了一個很糟糕的示例,基本上任何G5組可以包含幾個「 [br]「,有什麼辦法可以做到這一點? – Stefano

+0

只需將其添加爲可選組:'(?:\ [br])?'。我更新了答案。請注意,您不需要在字符類外部轉義']'。 –

+0

謝謝你的工作!我不知道這樣的功能,祝你有美好的一天! – Stefano