2015-03-02 56 views
0

本文捕獲中包含非捕獲組?

"dhdhd89(dd)" 

匹配對這個表達式

.+?(?:\() 

..returns 「dhdhd89(」。

爲什麼包括在捕獲開始括號? 兩種不同的工具,以及.NET Regex類,返回相同的結果。所以我收集這裏有一些我不明白這一點。

我閱讀我的正則表達式的方式是。

  • 匹配任何字符,至少一個匹配項。儘可能少。
  • 匹配的字符串後面應緊跟一個開始括號,但不包含在捕獲中。

我可以找到解決方法,但我仍然想知道發生了什麼。

回答

1

只需將未捕獲組設置爲肯定的超前斷言。

.+?(?=\() 

.+?非貪婪的一個或多個字符,接着一個左括號匹配。斷言不會匹配任何字符,但斷言匹配是否可能。但非捕獲組將執行匹配操作。當您使用

^([^(]+) 

DEMO

+0

是的,我讀了錯誤的例子。我認爲「(?:」是如何定義一個非捕獲組,Expresso確定它是這樣的,但是替換:for =使它全部正常工作 – Tormod 2015-03-02 13:09:35

1

你可以使用這個否定基於正則表達式之前字面(只捕獲文本

.+?(?:\() 

正則表達式引擎不匹配(在初始文本後,但它只是不會在捕獲的g中返回分組給你。

+0

實際上,這是我使用的解決方法,很好的調用 – Tormod 2015-03-02 13:08:19

+1

您可以稱它解決方法,但**否定爲基礎的正則表達式**優於'非貪婪'量詞'。+?'由於沒有回溯和效率。 – anubhava 2015-03-02 14:19:41

+0

讚賞。謝謝。 – Tormod 2015-03-03 12:15:20

1

你沒有帶定義捕獲組,那麼我猜您顯示整場比賽(組0),你可以這樣做:

(.+?)(?:\() 

和你想要的字符串是在第1組

或使用作爲@AvinashRaj說的前瞻。