Rubyの文字列で正規表現一致を実行し、最初の一致でそれを短絡させる方法を探しています。
私が処理している文字列は長く、標準的な方法(match
メソッド)のように見えるため、全体を処理し、各一致を収集し、すべての一致を含むMatchDataオブジェクトを返します。
match = string.match(/regex/)[0].to_s
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"
[]
:を使用できます(match
に似ています)
"[email protected]"[/\+([^@]+)/, 1] # matches what is inside ()
# => "account2"
"[email protected]"[/\+([^@]+)/, 0] # matches whole regexp
# => "+account2"
試合の存在のみが重要である場合は、
/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
この機能が素晴らしいのか、まったく夢中なのかはまだわかりませんが、正規表現でローカル変数を定義できます。
/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"
正規表現(regex)は、有限状態マシン(FSM)に他なりません。
FSMは「この状態は可能かどうか」という質問に答えようとします。
一致が見つかるまで(成功)、またはすべてのパスが探索されて一致が見つからないまで(失敗)、パターンマッチを試みます。
成功すると、「この状態は可能かどうか」という質問に答えます。 「はい」と回答されました。したがって、それ以上のマッチングは不要であり、正規表現が返されます。
詳細については、 this および this を参照してください。
さらに: ここに興味深い例があります 正規表現の仕組みを示します。ここでは、与えられた数が素数であるかどうかを検出するために正規表現が使用されます。この例はPerlですが、Rubyでも作成できます。