2012-05-18 30 views
4

我需要幫助,爲此問題創建最佳可能的正則表達式。Java正則表達式。獲取特定關鍵字之間的子串

我有組合/起始和結束測試,我需要得到全部子字符串/起始分隔到結束分隔之間的任何單詞。

假設定界符的這個表:

開始| END

CAT | DOG

APPLE | ORANGE

LION | ZEBRA

PANDA | CAT

樣品輸入:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6 
APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA 
substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12 
CAT substring13 substring14 APPLE substring15 substring 16 ORANGE 

輸出必須是:

  1. CAT substring2 substring3 DOG
  2. APPLE substrin7 substring8 ORANGE
  3. PANDA子11 CAT
  4. LION substring10子11 ZEBRA
  5. APPLE substring15 substring16 ORANGE

我的正則表達式:

CAT (.)*? DOG | APPLE (.)*? ORANGE | LION (.)*? ZEBRE | PANDA (.)*? CAT 

我有問題處理有其它起始定界符的多個occurence字符串。

舉個例子:

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

我知道,這將匹配這個CAT *(。)? DOG但這是錯誤的,因爲子字符串包含起始的定界符之一。

我只需要一個正則表達式,這將讓所有的起始分隔符的話高達其匹配的結束分隔符,如果有史以來子不包含其他起始定界符的任何occurence。

有什麼建議嗎?由於

+0

可以在這些範圍相交的噸?例如CAT substring2 LION substring3 DOG substring4 ZEBRA –

+0

nope。它只會跳過 – nfinium

+0

如果它們包含一些其他起始定界符的出現,那麼是否要匹配該定界符? – keyser

回答

2

幫助我們這裏的技術叫做「lookaround」

我更新我的回答澄清nfinium和反饋之後,從jsobo

CAT ((?!(APPLE|LION|PANA)).)*? DOG|APPLE ((?!(CAT|LION|PANDA)).)*? ORANGE|LION ((?!(CAT|APPLE|PANDA)).)*? ZEBRA|PANDA ((?!(APPLE|LION)).)*? CAT 

給定輸入:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12 CAT substring13 substring14 APPLE substring15 substring 16 ORANGE string CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG etc. CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG wordx 

它匹配

CAT substring2 substring3 DOG 
APPLE substring7 substring 8 ORANGE 
PANDA substring11 CAT 
LION substring10 substring11 ZEBRA 
APPLE substring15 substring 16 ORANGE 
CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG 

Specificaly,這將不匹配如下所示:nfinium

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

而且也符合正如你所指出

CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG 

你說,它應該符合以下

CAT substring12 DOG 

但我不認爲它不應該,因爲從上面的CAT是結束定界符

PANDA substring11 CAT 

這個正則表達式產生了預期的結果nfinium

注意,按照nfinium CAT思想的要求可以是一個起始和一個結束定界符

CAT | DOG 
PANDA | CAT 
+0

這doesn 't找到... CAT子字符串12 DOG在第三行...它也不會處理下面的字符串CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG等等,但是想法很接近。 –

+0

@jsobo我的回答不完整。我試圖暗示可能的解決方案,但我同意有更多需要克服的挑戰。我閱讀了額外的需求並更新了我的正則表達式。你能否做一個評論,因爲我也考慮到你的反饋。 – buckley

+0

我也許有機會稍後再看看這個......但它使得你的正則表達式更具可讀性當單個空間表達爲[]時,恕我直言,所以「\ d [] \ d」比「 \ d \ d「,因爲使用方括號,您知道它是1個空格..不需要點擊並移動光標即可。 –

0

我認爲,關鍵這是第2和輸出:它包含在

"APPLE substrin7 substring8 ORANGE" 

"CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG" 

所以bascially你必須抓住貓不跟APPLE | ORANGE | LION | ZEBRA |熊貓| CAT ,因爲那些將啓動另一個組。這是可能的,但是編寫一個正則表達式來做這件事就像試圖用正則表達式解析HTML一樣。

參見: RegEx match open tags except XHTML self-contained tags

這是可以做到,但正則表達式將是非常複雜的問題,這是一個最好的代碼來處理...

這裏是什麼,我想你想的例子處理前兩個開始結束組合。

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)|(APPLE(?!.+(?:APPLE|LION|ZEBRA|PANDA|CAT|DOG).+ORANGE).*?ORANGE) 

就在第一組...

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG) 

,所以你可以看到,如果這有更多的組合,它只是變得非常冗長。

+0

我的解決方案仍然存在缺陷,因爲它無法處理WORD ...換句話說...... SUPERCAT item1 item2 AwesomeDOG將被捕獲。還需要解決線條規則問題的開始和結束 –

+0

也不會找到每個發生只是最後一個......所以,如果你可以在一條線上的多組貓/狗它不會找到它.. –

相關問題