web-dev-qa-db-ja.com

Ruby regexの最初の一致を返します

Rubyの文字列で正規表現一致を実行し、最初の一致でそれを短絡させる方法を探しています。

私が処理している文字列は長く、標準的な方法(matchメソッド)のように見えるため、全体を処理し、各一致を収集し、すべての一致を含むMatchDataオブジェクトを返します。

match = string.match(/regex/)[0].to_s
92

variableName[/regular expression/]。これは、irbからの出力例です。

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"
128
Presidenten

[]:を使用できます(matchに似ています)

"[email protected]"[/\+([^@]+)/, 1] # matches what is inside ()
# => "account2"
"[email protected]"[/\+([^@]+)/, 0] # matches whole regexp
# => "+account2"
52

試合の存在のみが重要である場合は、

/regexp/ =~ "string"

いずれにしても、matchは最初のヒットのみを返し、scanは文字列全体を検索します。したがって

matchData = "string string".match(/string/)
matchData[0]    # => "string"
matchData[1]    # => nil - it's the first capture group not a second match
22
Slartibartfast

この機能が素晴らしいのか、まったく夢中なのかはまだわかりませんが、正規表現でローカル変数を定義できます。

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"

http://Ruby-doc.org/core-2.1.1/Regexp.html から取得)。

4
Felix

正規表現(regex)は、有限状態マシン(FSM)に他なりません。

FSMは「この状態は可能かどうか」という質問に答えようとします。

一致が見つかるまで(成功)、またはすべてのパスが探索されて一致が見つからないまで(失敗)、パターンマッチを試みます。

成功すると、「この状態は可能かどうか」という質問に答えます。 「はい」と回答されました。したがって、それ以上のマッチングは不要であり、正規表現が返されます。

詳細については、 this および this を参照してください。

さらに: ここに興味深い例があります 正規表現の仕組みを示します。ここでは、与えられた数が素数であるかどうかを検出するために正規表現が使用されます。この例はPerlですが、Rubyでも作成できます。

1
Litmus