2009-01-03 43 views
1

我困在RegEx問題中,看起來很簡單,但我無法正常工作。正則表達式在一個輸入塊中捕獲一個可選組

假設我有輸入這樣的:

Some text %interestingbit% lots of random text lots and lots more %anotherinterestingbit% 
Some text %interestingbit% lots of random text OPTIONAL_THING lots and lots more %anotherinterestingbit% 
Some text %interestingbit% lots of random text lots and lots more %anotherinterestingbit% 

有許多重複的塊輸入和我想捕捉一些事情,總是在那裏(%interestingbit%和%anotherinterestingbit%)每個塊,但也有一些文字可能會或可能不會出現在它們之間(OPTIONAL_THING),如果它在那裏,我想捕捉它。

正則表達式像這樣只匹配在它OPTIONAL_THING(和命名捕捉作品)塊:

%interestingbit%.+?((?<OptionalCapture>OPTIONAL_THING)).+?%anotherinterestingbit% 

所以看起來它只是一個讓全組可選的事,對不對?這就是我想:

%interestingbit%.+?((?<OptionalCapture>OPTIONAL_THING))?.+?%anotherinterestingbit% 

但我發現,雖然這個命名捕獲(OptionalCapture)匹配所有3個街區,在所有這些空!我如何得到這個工作?

請注意,每個區塊中可能有很多文字,包括換行符,這就是爲什麼我放入「。+?」的原因而不是更具體的東西。我正在使用.NET正則表達式,使用The Regulator進行測試。

回答

2

我的想法與Niko的想法類似。不過,我建議放置第二個。+?如下圖所示:

%interestingbit%.+?(?:(?<optionalCapture>OPTIONAL_THING).+?)?%anotherinterestingbit% 

這可以避免不必要的回溯。如果第一個。+?位於可選組中,並且OPTIONAL_THING在搜索字符串中不存在,直到它到達字符串的末尾,正則表達式纔會知道這一點。然後它需要回溯,或許相當多,以匹配%anotherinterestingbit%,正如你所說的那樣,它將永遠存在。

此外,由於OPTIONAL_THING存在時,它總是位於%anotherotheringbit%之前,因此它後面的文本實際上也是可選的,並且更自然地適合可選組。

0

爲什麼你有額外的括號?

試試這個:

%interestingbit%.+?(?<OptionalCapture>OPTIONAL_THING)?.+?%anotherinterestingbit% 

或者,也許這將工作:

%interestingbit%.+?(?<OptionalCapture>OPTIONAL_THING|).+?%anotherinterestingbit% 

在這個例子中,該組捕捉OPTIONAL_THING,或什麼都沒有。

+0

不,對不起,這些工作都沒有。它們與我的正則表達式相同,該組是可選的 - 所有3個塊匹配,但沒有捕獲OPTIONAL_THING。 – EMP 2009-01-03 03:01:04

+0

@Evgeny,你確定。+?正在使通配符「不明朗?」也許你可以試試。*?代替。 – strager 2009-01-03 03:06:42

+0

@strager,試過,沒有區別 – EMP 2009-01-03 03:08:58

0

試試這個:

%interestingbit%(?:(.+)(?<optionalCapture>OPTIONAL_THING))?(.+?)%anotherinterestingbit% 

首先有一個非捕獲組相匹配.+OPTIONAL_THING或沒有。如果找到了匹配項,那裏面就是指定的組,它爲您捕獲OPTIONAL_THING。剩下的就是.+?%anotherinterestingbit%

[編輯]:我加了幾個圓括號的額外的捕捉組,所以現在捕獲組匹配以下:

  • $ 1:OPTIONAL_THING:OPTIONAL_THING或沒有
  • $ 2或$ optionalCapture之前文本或者沒有
  • $ 3:OPTIONAL_THING後的文本,或者如果OPTIONAL_THING沒有找到,%interestingbit%和%anotherinterestingbit%

氬之間全文e你要找的三場比賽?

相關問題