2017-06-01 12 views
0

これは、Lazy (ungreedy) matching multiple groups using regexに関する以下の質問です。私は方法を使用しようとするが、あまり成功していない。Ruby:怠惰な正規表現マッチングを実行するには?

gitlab APIから文字列を取得し、すべてのreposを抽出しようとします。レポの名前は "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.scan(/\"https\:\/\/gitlab\.example\.com\/foo\/(.*?)\.git\"/) 

次の正規表現は[["xxx"]]を返します

gitlab_str = "\"https://gitlab.example.com/foo/xxx.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、name:" ... "、パス:" ... "などのものと一致するため、動作しないと思っていました。 ........ git "言い換えれば、 "xxx"と ".git"の間にゴミがあります。したがって、(。*)を許可する代わりに、アルファベットセットを制限する必要があります。ありがとう! – user180574

+0

URLに '.git 'で終わらないケースがある場合、このRegEXは問題になるので、ワイルドカードを使用する代わりにアルファベットを制限するなど、より洗練されたマッチングが必要です。 "' '.git'の前など... –

+0

ありがとう、この場合、私は*。 [^、] +はコンマがrepo名に表示されるべきではないので、かなりうまくいきます。 – user180574

関連する問題