正規表現を使用してRubyの文字列から部分文字列を抽出する


130

Rubyの文字列から部分文字列を抽出するにはどうすればよいですか?

例:

String1 = "<name> <substring>"

から抽出substringしたいString1(つまり、<およびの最後のオカレンス内のすべて>)。

回答:


134
String1.scan(/<([^>]*)>/).last.first

scanそれぞれの<item>in とのString1間のテキストを1要素の配列で含む配列を作成します(キャプチャグループを含む正規表現で使用すると、スキャンは各一致のキャプチャを含む配列を作成するため)。それらの最後の配列を提供し、その中の文字列を提供します。<>lastfirst


319
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

scan結果が1つだけ必要な場合は、を使用する必要はありません。Rubyがあれば、
Pythonを使用する必要はありません。matchString[regexp,#]

参照:http : //ruby-doc.org/core/String.html#method-i-5B-5D

注意: str[regexp, capture] → new_str or nil


37
他の完全に有効な(そして私が意見を述べるかもしれませんが、もっと読みやすい)ソリューションを信用する必要はありません。
coreyward 2010年

41
@coreyward、より良い場合は、議論してください。たとえば、sepp2kのソリューションの方が柔軟性が高いためif we need only one result、ソリューションで指摘しました。そしてmatch()[]、それは1つではなく、2つの方法だから、遅くなります。
Nakilon、2010年

4
これは、提示されたすべての方法の中で最速ですが、最も遅い方法でも、私のマシンでは4.5マイクロ秒しかかかりません。この方法の方が速い理由を推測する必要はありません。パフォーマンスでは、推測は役に立たない。測定のみがカウントされます。
ウェインコンラッド

8
私はこの解決策をより直接的かつ要点があると思っています(Rubyが初めてなので)。ありがとう。
ライアンH.11年

@Nakilonの読みやすさは、製品とチームの全体的な成功を考慮すると、小さなパフォーマンスの違いを上回る可能性があるため、coreywardは有効なコメントをしました。とは言っても、string[regex]このシナリオでも読みやすいと思うので、それを個人的に使用しました。
ニック

24

そのための正規表現をかなり簡単に使用できます…

単語の前後にスペースを許可する(ただし、スペースを保持しない):

str.match(/< ?([^>]+) ?>\Z/)[1]

または、スペースを入れずに:

str.match(/<([^>]+)>\Z/)[1]

1
最後が<>実際に文字列の最後になる必要があるかどうかはわかりません。たとえば文字列foo <bar> bazが許可されている場合(そして結果を提供することになっている場合bar)、これは機能しません。
sepp2k 2010年

私は彼が提供したサンプル文字列に基づいて行ったところです。
coreyward 2010年

10

matchメソッドを使用した、もう少し柔軟なアプローチを次に示します。これにより、複数の文字列を抽出できます。

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

3

より単純なスキャンは次のようになります。

String1.scan(/<(\S+)>/).last
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.