2012-04-26 76 views
2

的名單,我需要使用到生產數字的命名捕獲列表中的名稱捕獲,需要數

示例源數據

This is a comment on line 1 
Here is another Comment Line 2 
Log ID 1234,5555,2342 

(?<id>(\d+)*)我會拿起

結果
1 
2 
1234 
5555 
2342 

但是這個錯誤提取了12。我需要它在Log ID Only之後提取項目。

我要尋找一個正則表達式,將返回

1234 
5555 
2342 

在一個名爲組名爲id

+0

是有多個日誌的ID一樣,在真實的數據線? – dc5553 2012-04-26 18:30:12

+0

字符串'日誌ID'總是在那裏?總是有三個ID?它們總是用逗號分隔嗎? – alan 2012-04-26 18:40:24

+0

它是否總是採用完全相同的格式「Log ID 1234,5555,2342」? – Jack 2012-04-26 18:51:50

回答

2

如果你的語言支持可變長度lookbehinds,你應該能夠使用以下命令:

(?<=Log ID.*)(?<id>\d+) 

我也對你的原始正則表達式做了一些修改,因爲我真的沒有看到附加捕獲組的點o f指定的捕獲組或嵌套重複((\d+)*相當於(\d*),但我認爲您實際上需要\d+,以便它要求您至少匹配一位數字)。

如果你不能使用可變長度lookbehinds(大多數語言),那麼你可能需要分兩步做到這一點。首先用「日誌ID」匹配任何行,然後在這些行中查找數字。

+0

您不能在向後看中使用可變長度。 – Jack 2012-04-26 18:44:20

+1

@傑克 - 在.NET正則表達式(可能還有其他),你可以。 – 2012-04-26 18:45:38

+0

這個作品完全謝謝你。所提出的其他解決方案都存在小問題。 – 2012-04-26 20:17:07

0

背後的否定斷言會做詭計嗎?

(?<![Ll]ine)(?<id>\d+) 
0

你也可以做到這一點沒有看(提前|後面):

"Log\s+ID\s+((?<id>\d+),?)+" 

這會給你的每一個號碼在id

  • Log\s+ID\s+一個單獨的名爲組:比賽您以後的ID,但不捕獲
  • (?<id>\d+),?:捕獲號碼並允許選擇逗號之後(但不捕獲)
  • +:重複至少一次

然而,這引起一個問題,因爲你將有幾組具有相同的名稱 - 這取決於語言這將如何被處理。

或者您可以使用此正則表達式來登錄ID後,整個字符串捕獲到一個組:

"Log\s*ID\s+(?<id>(?:\d+,?)+)"