Rubyでの正規表現の使用

正規表現は、一部の人にとってはすべてのトラブルからの救いであり、他の開発者にとっては悪夢です。客観的に言えば、これは強力なツールですが、アプリケーションには細心の注意が必要です。 Rubyの正規表現(正規表現、正規表現、正規表現)はPerl 5構文に基づいているため、Perl、Python、またはPHPを使用したことのある人なら誰でも使い慣れています。 しかし、言語の各コンポーネントは独自のアプローチで実装されているため、Rubyは優れています。このツールの使用を簡素化し、その力を高めます。 私の短い記事では、Rubyの常連の機能とさまざまな演算子でのアプリケーションについて説明します。



Rubyでは、すべてがオブジェクトです



まず、正規表現が対応するクラスのオブジェクトであることは注目に値します。 したがって、newおよびmerge(結合)を呼び出すことで作成できます。



r1 = Regexp.new “a” r2 = Regexp.new “b” ru = Regexp.union r1, r2
      
      







結合の結果の式は、結合されたテンプレートの少なくとも1つに対応する行に対応します。



通常の文字列一致演算子は、最初の一致のインデックスまたはnilを返しますが、多くの場合、見つかった一致に関する他の情報が必要です。 Perlと同様に、特別な変数$〜、$ '、$&などを使用できます。 グループに対応する変数$ 1、$ 2、...が覚えやすい場合、一般に他の人がどのように他の人を使用するかは常に謎のままです。 そのため、Rubyにはもちろん別のアプローチがあります-Regexp.last_matchメソッドを使用できます



 “abcde” =~ /(b)(c)(d)/ Regexp.last_match[0] # "asd" Regexp.last_match[1] # "b" Regexp.last_match[2] # "c" Regexp.last_match[3] # "d" Regexp.last_match.pre_match # "a" Regexp.last_match.post_match # "e"
      
      







名前付きグループ



バージョン1.9以降、Rubyは名前付きグループの構文をサポートしています。

 "a reverse b".gsub /(?<first>\w+) reverse (?<second>\w+)/, '\k<second> \k<first>' # “ba”
      
      







同じ例はバックリンクの使用を示していますが、この機能はすべての最新のPCRE実装にすでに存在しています。



\ k <group_name>-この特別なシーケンスは、本質的に名前付きグループのバックリンクの類似物です。

\ g <group_name>は、以前に指定された名前付きグループの繰り返しに対応するシーケンスです。 それらの違いは、例を使用して簡単に示されています。



 "1 1" =~ /(?<first>\d+) \k<first>/ # 0 "1 2" =~ /(?<first>\d+) \k<first>/ #nil "1 a" =~ /(?<first>\d+) \k<first>/ #nil "1 1" =~ /(?<first>\d+) \g<first>/ # 0 "1 2" =~ /(?<first>\d+) \g<first>/ # 0 "1 a" =~ /(?<first>\d+) \g<first>/ #nil
      
      







MatchDataオブジェクトを介して、これらのグループに関連付けられた一致を取得することもできます。

 Regexp.last_match[:first]
      
      







コンプライアンスをチェックする他の方法



Rubyの従来の=〜に加えて、文字列を正規表現と照合する他の方法があります。 特に、matchメソッドはこれを対象としています。これは、StringクラスのオブジェクトとRegexpのインスタンスの両方に対して呼び出すことができるため、特に優れています。 しかし、それだけではありません。 通常のインデックス方法を使用して、通常の文字列と一致する文字列を取得できます。



 "abcde"[/bc?f?/] # "bc"
      
      





スライス方法と同様に:

 "abcde".slice(/bc?f?/) # "bc"
      
      







さらに、最も論理的な方法とは思えない別の方法もあります。

 /bc?f?/ === "abcde" # true
      
      





誰もが同様の構文を使用することはほとんどありませんが、Ruby言語のこの注目すべきプロパティには、以下に説明するアプリケーションがあります。



さまざまな関数でのレギュラーの使用



Rubyでの正規表現の最も便利なアプリケーションの1つは、それほど一般的ではありませんが、caseステートメントでの使用です。 例:



 str = 'september' case str when /june|july|august/: puts "it's summer" when /september|october|november/: puts "it's autumn" end
      
      







問題は、ケースの比較が前述の演算子===(詳細はこちら )によって実行されることです。これにより、このような場合に正規表現を非常に簡潔かつエレガントに使用できます。



正規関数は、split関数でも使用できます。 ruby-docを使用した例:

 "1, 2.34,56, 7".split(%r{,\s*}) # ["1", "2.34", "56", "7"]
      
      





この関数を使用して文字列から単語のリストを取得する1つの方法:

 “one two three”.split(/\W+/)
      
      





キリル文字列を使用するには:

 ",      ".split(/[^[:word:]]+/) # ["", "", "", "", "", "", ""] (ruby 1.9 only)
      
      







スキャンメソッドを使用して文字列を部分に分割する方がはるかに便利な場合があります。 このメソッドを使用した前の例:

 ",      ".scan(/[[:word:]]+/) # ["", "", "", "", "", "", ""] (ruby 1.9 only)
      
      







サブ文字列の最初の出現を置き換えるサブ関数は、入力としてRegexpオブジェクトを受け入れることもできます。

 "today is september 25".sub(/\w+mber/, 'july') # "today is july 25"
      
      





同様に、sub!、gsubおよびgsub!..メソッドで正規表現を使用できます。



文字列を3つの部分に分割するパーティション方式では、正規表現を区切り文字として使用することもできます。

 "12:35".partition(/[:\.,]/) # ["12", ":", "35"]
      
      





同様に、rpartitionメソッドで正規表現を使用できます。



indexメソッドとrindexメソッドはレギュラーでも機能します;もちろん、これらは文字列内で最初と最後に出現するインデックスを返します。



さらに読む



1. Friddle-正規表現

2.フラナガン、松本-Rubyプログラミング言語

3. Ruby-docクラスの正規表現



All Articles