2017-08-29 80 views
3

我一直在尋找這個問題的答案,我還沒有得到明確的答案。使用正則表達式只抓取模式的第一個匹配

我有文字:

微星的GeForce GTX 1080鈦的DirectX 12的GeForce GTX 1080鈦GAMING X 11G

我使用正則表達式

GTX +?\d+ 

返回結果GTX 1080兩次

我想只抓住一場比賽並退出。

有沒有一個正則表達式可以做到這一點?或者我需要使用正在使用的語言的正則表達式框架?

+1

您理論上只能使用負向回溯找到第一個匹配,但使用現在正在使用的任何內容並且只取得第一個結果可能會更容易。 – L3viathan

+2

你正在使用什麼正則表達式?如果你搜索沒有全局標誌,你只會得到第一場比賽,例如在JS正則表達式中。 –

+4

這完全取決於您使用的語言和框架。你可以做的最正則表達式是把你的模式放在一個捕獲組中,然後使用'[\ s \ S] * $'來消耗其餘的輸入。 – Tezra

回答

2

這隻抓住一場比賽並退出。爲了清楚起見,它抓住了最後一場比賽,但它做你想做的事。測試在regex101.com

GTX +?\d+(?!.*GTX +?\d+.*$) 
+0

謝謝Marcin。在我想要做的事情的背景下。這工作完美。謝謝。 – mjrice04

2

通過@Tezra提出除了$令牌末可能是不必要的應該工作的方法(可能依賴於正則表達式的味道你使用)。 (GTX \d+)[\s\S]*DEMO

此方法會將您的第一個匹配項隔離爲一個捕獲組,您可以使用所選語言檢索該捕獲組。你沒有指定一個,所以我只是把它留在那。 這裏是發生了什麼事情的第二種方法:在你的查詢(GTX \d+)將其放入第一個(也是唯一一個)捕獲組

括號。

跟在[\s\S]後面的括號內的組將匹配該組中的任何單個字符。由於所有字符必須是空格(\s)或不是空格(\S),結果就是任何事情都會發生。

最後,末尾的*量化符將匹配上一組中的零個或多個連續字符,以確保您的字符串的其餘部分被消耗。

希望這會有所幫助。

+0

這個效果很好,這將是我如何在ETL管道中使用它,我正在建設 – mjrice04

+0

很高興聽到它。祝好運與您的其餘項目! –