2017-06-01 50 views
0

這是關於Lazy (ungreedy) matching multiple groups using regex的後續問題。我嘗試使用該方法,但不是很成功。Ruby:如何執行lazy正則表達式匹配?

我從gitlab API抓取一個字符串,並嘗試提取所有的回購。回購的名稱遵循「https://gitlab.example.com/foo/xxx.git」的格式。

到目前爲止,如果我嘗試這個,它的工作正常。

gitlab_str.scan(/\"https\:\/\/gitlab\.example\.com\/foo\//) 

但要加名通配符是棘手的,我用從前面的問題的方法:(。*?)

gitlab_str.scan(/\"https\:\/\/gitlab\.example\.com\/foo\/(.*?)\.git\"/) 

它說用懶惰匹配,但它似乎沒有上班。

非常感謝您的幫助。

+1

它返回'[[「xxx」]]',是不是預期的? –

+0

我更喜歡返回https://gitlab.example.com/foo/xxx.git,以任何方式來完成?謝謝! – user180574

+0

噢,如果匹配模式比'。*?'更復雜,那麼你可以使用'(?:...)',否則就不要使用圓括號 –

回答

1

如果我們有以下字符串:

gitlab_str = "\"https://gitlab.example.com/foo/xxx.git\"" 

下面的正則表達式將返回[["xxx"]],預計:

gitlab_str.scan(/\"https\:\/\/gitlab\.example\.com\/foo\/(.*?)\.git\"/) 

因爲你有(.*?)。請注意括號,因此只有括號內的內容纔會被返回。 如果你想返回整個字符串匹配,你可以刪除括號:

gitlab_str.scan(/\"https\:\/\/gitlab\.example\.com\/foo\/.*?\.git\"/) 

這將返回:

["\"https://gitlab.example.com/foo/xxx.git\""] 

它也適用於多次出現:

> gitlab_str = "\"https://gitlab.example.com/foo/xxx.git\" and \"https://gitlab.example.com/foo/yyy.git\"" 
> gitlab_str.scan(/\"https\:\/\/gitlab\.example\.com\/foo\/.*?\.git\"/) 

=> ["\"https://gitlab.example.com/foo/xxx.git\"", "\"https://gitlab.example.com/foo/yyy.git\""] 

最後,如果你想從結果匹配中刪除https://部分,那麼只包含除()之外的所有部分正則表達式:

gitlab_str.scan(/\"https\:\/\/(gitlab\.example\.com\/foo\/.*?\.git)\"/) 
+0

我看到了,以前我認爲它不起作用,因爲它也會匹配「https://gitlab.example.com/foo/xxx,名稱:」...「,路徑:」...「。 ........混帳」。換句話說,「xxx」和「.git」之間有垃圾。因此,不應允許(。*),我應該限制字母集。謝謝! – user180574

+0

如果URL有不以'.git'結尾的情況,那麼這個RegEX就會成爲問題,所以你需要更復雜的匹配,比如限制字母表而不是使用通配符,或者期望' 「'.git」之前的''等等...... –

+0

謝謝,對於這種情況,我替換。*?與[^,] +,因爲逗號不應出現在回購的名稱,這很好。 – user180574