web-dev-qa-db-ja.com

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

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

例:

String1 = "<name> <substring>"

substringString1から抽出したい(つまり、<>の最後の出現内のすべて)。

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

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

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

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

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

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

294
Nakilon

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

Wordの周囲にスペースを許可します(ただし、スペースは保持しません)。

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

または許可されたスペースなし:

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

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"
9

より単純なスキャンは次のとおりです。

String1.scan(/<(\S+)>/).last
2
Navid