Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

クールなRuby正規表現のトリック

昨日の正規表現の条件に関する記事をフォローして、Rubyの正規表現で実行できる他の巧妙なトリックを見てみるのは楽しいだろうと思いました。

正規表現による文字列の分割

おそらく、テキスト区切り文字を使用した文字列の分割に精通しているでしょう:

"one,two".split(",")
# => ["one", "two"]

しかし、splitが正規表現も受け入れることをご存知ですか?

# use `,` and `-` as delimiters
"one,two-three".split(/,|-/)
=> ["one", "two", "three"]

# Use comma as thousands separator for US currency,
# but use a space for Euros
"1,000USD".split /(?=.*(USD))(?(1),| )/

区切り文字のキャプチャ

これがきちんとしたパーティーのトリックです。通常、文字列を分割すると、区切り文字は消えます:

# The commas vanish!
"one,two".split(",")
# => ["one", "two"]

ただし、正規表現を使用して区切り文字をグループ内に配置する場合は、split 区切り文字もキャプチャします。

"one,two-three".split(/(,|-)/)
=> ["one", ",", "two", "-", "three"]

これが発生する理由は、split 実際には、各キャプチャグループの境界で文字列を分割します。

splitの悪用

splitを悪用できます matchのように動作させるため 。以下のコードでは、正規表現で4つのグループを使用して、文字列を4つの部分に分割しています。

"1-800-555-1212".split(/(1)-(\d{3})-(\d{3})-(\d{4})/)
=> ["", "1", "800", "555", "1212"]

正規表現がソース文字列全体と一致するため、結果の配列の最初の項目は空の文字列です。

グローバルマッチング

デフォルトでは、正規表現はパターンに1回だけ一致します。以下のコードでは、一致する可能性のあるものが5つあるにもかかわらず、一致するのは1つだけです。

"12345".match /\d/
=> #<MatchData "1">

Perlのような他の言語では、解決策は正規表現に「グローバル」のフラグを立てることです。 Rubyにはそのオプションはありませんが、String#scanはあります。 方法。

scan メソッドは、すべての一致を含む配列を返します:

"12345".scan /\d/
=> ["1", "2", "3", "4", "5"]

便利なブロック構文もあります:

"12345".scan /\d/ do |i|
  puts i
end

残念ながら、文字列を怠惰にスキャンする方法はないようです。したがって、この手法は、500MBのファイルの処理にはおそらく適していません。

グループでスキャン

この時点で、スキャンでグループを使用することで、どのような奇妙なトリックを実行できるのか疑問に思われることを願っています。

残念ながら、ここでの動作は完全に予測可能で退屈です。グループは多次元配列になります:

"hiho hiho".scan /(hi)(ho)/
=> [["hi", "ho"], ["hi", "ho"]]

奇妙なエッジケースが1つあります。グループを使用する場合、グループに含まれていないものは返されません。

"hiho hiho".scan /(hi)ho/
=> [["hi"], ["hi"]]
速記

=~について知っていると思います 正規表現が文字列と一致するかどうかを確認する方法として。一致が始まる文字のインデックスを返します。

"hiho" =~ /hi/
# 0
"hiho" =~ /ho/
# 2

ただし、一致を確認する別の簡単な方法があります。私は===について話している オペレーター。

/hi/ === "hiho"
# true

a === bと書くとき ルビーでは、「bはaで定義されたセットに属しているか」を尋ねています。または、この場合、「'hiho'は正規表現/hi/と一致する文字列のセットに属しますか "。

=== 演算子は、Rubyのcaseステートメントで内部的に使用されます。つまり、caseステートメントでも正規表現を使用できます。

case "hiho"
when /hi/
  puts "match"
end

triple-equals演算子は、独自のメソッドに正規表現または文字列のいずれかを受け入れさせる場合にも役立ちます。

無視するクラスの事前構成済みリストにない限り、エラーが発生したときにコードを実行したいとします。以下の例では、===を使用しています ユーザーが文字列または正規表現のいずれかを指定できるようにする演算子。

def ignored?(error)
  @ignored_patterns.any? { |x| x === error.class.name }
end

以上です!

確かに、このような小さなトリックがRubyとRails全体に散らばっています。特に気に入ったものがあれば教えてください!


  1. Excel でセルを分割する方法 (5 つの簡単なコツ)

    Microsoft Excel では、セルを分割するために利用できるいくつかのテクニックがあります。 複数の部分に。数式、ツール、または Power Query を使用して、セルまたは列を 2 つの部分に分割できます。この記事では、セルまたはテキストを簡単なイラストで分割するためのさまざまな適切な方法を学びます。 この記事の準備に使用した Excel ワークブックをダウンロードできます。 Excel でセルを分割する 5 つの簡単な方法 1.テキストから列への機能を使用して Excel でセルを分割する 次の表では、 テキスト にあるランダムな名前がいくつかあります。 桁。ここで行う

  2. Notepad++ の 5 つのクールなトリック

    Notepad++ は、おそらく Windows 用の最高のテキスト エディターです。カバーするのにかなりの数の記事が必要な膨大な範囲の機能があります.そして、これこそまさに私がやろうとしていることです:この高度に用途が広く洗練されたテキスト エディターの信じられないほどの力を紹介します。テキスト ファイルを操作するためのメモ帳やワードパッドはもう必要ありません。またはスクリプト。または HTML ファイル。そこで、Notepad++ を最大限に活用するのに役立つ (最初の) 5 つの優れたトリックを紹介します。 1. コードに合わせて言語を設定します Notepad++ の強力な