質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

1007閲覧

正規表現で、@マーク移行、もしくは先頭からを表現したい

kelventa

総合スコア9

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2018/04/08 03:22

rubyで正規表現を書きたいのですが、「@マーク」移行、@マークが無ければ先頭からという表現が調べてみたのですがわかりませんでした。

やりたいこととしては下記のように、

user@github.com:rails/rails.git #@マークが含まれる
github.com:rails/rails.git # @マークは含まれない
の2つの表現から、
github.com
という文字列を取り出したいです。これを、1つの正規表現で表現したいです。

@マークを含めるこちらの表現はうまくいきました。

"user@github.com:rails/rails.git".match %r{^.*@(.+?)[/|:]} => #<MatchData "user@github.com:" 1:"github.com">

ただ、@マークが含まれない場合にはこの表現をどう修正すれば良いか調べてもわからず・・。別の正規表現で対応する事になるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

%r{(?:^|@)([^@]+?)[/:]}くらいでいいかと思います。

投稿2018/04/08 07:06

otn

総合スコア84551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelventa

2018/04/08 09:16

回答ありがとうございます。 すみません、(?:^|@)の部分の意図はどういったものでしょうか? これが無くても意図した表現にはなるようなので。
otn

2018/04/08 11:57

> 「@マーク」移行、@マークが無ければ先頭から というそのままですが。
kelventa

2018/04/08 13:58 編集

すみません、説明不足でした。 (?:^|@)を除いた([^@]+?)だけで、「先頭または@移行の文字列」を表現していると思ったので、(?:^|@)の部分が必要となる文字列やケースがわからなかったのです。 ``` irb(main):052:0> "github.com:rails/rails.git".match %r{([^@]+?)[/:]} => #<MatchData "github.com:" 1:"github.com"> ``` ``` irb(main):053:0> "user@github.com:rails/rails.git".match %r{([^@]+?)[/:]} => #<MatchData "github.com:" 1:"github.com"> ``` https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html の、グループの(?:pat) だとは思うのですがパフォーマンス的な目的でしょうか?
otn

2018/04/08 22:56

質問の意図は最初のコメントで伝わってますよ。それに対しての回答ですが、こちらこそ言葉不足でした。 要件をそのまま書いただけで、全体として必要十分かどうかの検討はしていませんので、不要なら省いてください。
kelventa

2018/04/09 02:21

ご説明ありがとうございます!最もシンプルに表現してあるように見えたのでBAさせてもらいました。
guest

0

ruby

1test = %w[user@github.com:rails/rails.git github.com:rails/rails.git] 2test.each{|s| 3 p s.match(%r{(?<domain>^[^@:/]*)[:/]|@(?<domain>[^@:/]*)[:/]}) 4 .named_captures["domain"] 5}

投稿2018/04/08 05:16

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

量指定子?でどうでしょうか。

ruby

1"user@github.com:rails/rails.git".match %r{^(?:.*@)?(.+?)[/|:]} 2=> #<MatchData "user@github.com:" 1:"github.com"> 3"github.com:rails/rails.git".match %r{^(?:.*@)?(.+?)[/|:]} 4=> #<MatchData "github.com:" 1:"github.com"> 5

投稿2018/04/08 05:16

emasaka

総合スコア524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無理して一つの正規表現で片付けようとせず、
0. @(.*?): で@がある場合のマッチングを試みる。
0. 失敗したなら先頭からのマッチングを試みる。

こういう2段構えで対処するのがわかりやすくていいのではないでしょうか。

投稿2018/04/08 04:46

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問