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

Ruby で正規表現をマスターする:実践ガイド

RegEx について聞いたことがあるかもしれません。これは正規表現の略です。恐ろしいように思えるかもしれませんが、パターンの意味と、実際の式を構築して使用する方法に慣れてしまえば、それほど悪いことではありません。より抽象的な方法で文字列とテキストについて考えることに慣れれば、一連のデータの中から共通のパターンを探す問題を解決するための便利なツールになります。 

RegEx はパターン マッチングの方法であり、パターンに基づいて文字列またはテキストをフィルタリングし、通常は目的のテキストを抽出して変更する方法です。この記事では、正規表現の使用方法と、プロジェクトのロジックに組み込むために Ruby メソッドを使用して正規表現をテストする方法について説明します。

RegEx を視覚化して理解する際に非常に役立つツールの 1 つは、Rubular と呼ばれるサイトです。ここのリンクをクリックして、すでに入力されているテキストのブロックを使用して正規表現をテストします。 2 つのスラッシュの間に、「neighbor」という単語を含む文字列があることがわかります。 

信じられないかもしれませんが、これは正規表現です。単語、文、段落全体を技術的には正規表現と呼ぶこともできます (2 つのスラッシュの間にある場合に限ります)。 Rubular 環境は、テキスト ブロック内のパターン「neighbor」のすべてのインスタンスを強調表示します。neighbor がより大きな単語の一部であるインスタンスも含めます。そうは言っても、単語の完全一致よりも抽象的なものを見つけたい場合もあります。ここでメタキャラクターが登場します。

メタキャラクター

Ruby で正規表現をマスターする:実践ガイド 熟練のプログラマーにとって正規表現の使用は難しい場合があるため、落胆しないでください。

アトムが私たちが目にするほぼすべてのものの構成要素であるのと同じように、メタキャラクターは正規表現の構成要素です。正規表現を追加すると、全体のパターンが変化します。全体的なパターンが変化すると、使用した方法から得られる結果も異なる可能性があります。 

以下に、正規表現を変更して、自分に合ったパターンを見つけるためのいくつかの方法を示します。絶対に正しい人はいません。 電話番号や電子メールの正規表現の書き方など、すべてはプロジェクトに何が必要かによって決まります。 

MetacharacterMatchesExample[abc]文字列内の 1 文字 (a、b、または c) に一致する文字クラス
/[eig]/ は、neighbor、apple、gate の一部と一致します[^abc] 文字列内のすべての文字に一致する否定文字クラスただし a、b、または c/[^eig]/ は、neighbor、apple、またはgate[a-z] の一部と一致します。 a-z/[e-i]/ の範囲内の任意の 1 文字と一致する文字クラスです。 neighbour、apple、またはgate の一部の 1 文字と一致します。
[a-zA-Z]a-z または A-Z の文字範囲に一致する文字クラス
/[e-i]/ は、「Hi neighbors!」、Grapple、または Gate の部分の 1 文字と一致します^ 行頭/^Hello/ は、'Hello' で始まる行と一致します$行末/Goodbye$/ は、'Goodbye'\AStart of string で終わる行と一致します。 ‘^’ に似ていますが、複数行モードはありません /\Aa/ は、apple の ‘a’ と一致しますが、文字列の先頭ではないため、apricot の ‘a’ とは一致しません。
リンゴ
apricot\z 文字列の終わり。 「$」に似ていますが、複数行モードはありません。/\za/ は、文字列の末尾ではないため、zebra の「a」と一致しますが、libra の「a」とは一致しません
librazebra.ワイルドカード。ドットは任意の文字に一致します。 /./ は、apple の任意の 1 文字と一致します+前のメタキャラクタの 1 つ以上と一致します/aa+/ は、'aa'、'aaaaaaa' と一致しますが、'a' とは一致しません。これは、前のメタキャラクタの 1 つ以上である必要があるため (この例では 2 番目の a)*前のメタキャラクタの 0 つ以上と一致します/ab*/ は、'a'、'ab'、'abbbbbb' と一致します\s任意の空白文字/^The\s.+s$/ ビートルズと一致します 、ローリング ストーンズ、クランベリーズなど \SA空白文字以外の文字/\S+/ はビートルズに一致します 、ローリング ストーンズ、クランベリーズなど \d任意の数字/\d+/ は、22、33333、0 などに一致します。\DA 数字以外の文字/\D+/ は、「こんにちは、さようなら」に一致します。\w任意の単語文字/ny\w*/ は、「ny_152」、「nypost39」などに一致します。\WA任意の非単語文字/\W+/ は、')(*&^%$'a{3}のうち 3 つと一致します) 「a」/\d{3}-\d{3}-\d{4}/ は 555-555-5555a に一致します{3,}3 つ以上の「a」/[a-zA-Z0-9!#$^&*)(]{8,}/ は「xE*BqRx14B7TAQp」⇐ に一致します。これはパスワードとして使用できるようです!a{3, 6} ‘a’/[a-zA-Z0-9!#$^&*)(]{8,32}/ は、長さが 3 文字を超え 32 文字未満であるため、‘0XX!pC3Odpu30Qc’ と一致します。a?0 または ‘a’/\d?-\d{3)-\d{3}-\d{4}/ の 1 つは、先頭に国際コードが付加された電話番号と、国際コードが付加されていない電話番号に一致します。正面。 

メタキャラクターの使用は、ユーザーが Web サイト上のフォームに入力する際の検証に最適です。正しい情報が入力されていることを確認したいと考えています。これは、住所、電子メール、電話番号のパターンが正しい形式であることを確認するために RegEx を使用するのに最適です。これにより、データベースがより適切に整理され、新しいアカウントを登録する際のユーザー エラーが少なくなります。 

Ruby で正規表現をテストする方法

スキャンとマッチを区別するために使用するコードは次のとおりです。

#!/usr/bin/ruby
 
class RegexTest
 def initialize(str, regex)
 @str = str
 @regex = regex
 @result = str.scan(regex)
 end
 def display_details()
 puts "String = #@str"
 puts "regex = #@regex"
 puts "result = #@result"
 end
end
# Create Objects
str1 = RegexTest.new("The rain in Spain stays mainly on the plain", /\w+ain/)
str2 = RegexTest.new("In Hertford, Hereford, and Hampshire, hurricanes hardly ever happen", /H\w+/)
# Call Methods
str1.display_details()
str2.display_details()

スキャン

Ruby の scan メソッドは、正規表現に一致するすべての文字列の配列を返します。

str1:result = ["rain", "Spain", "main", "plain"]

str2:result = ["Hertford", "Hereford", "Hampshire"]

これにより、結果に対してやりたいことが何でもできるようになります。

RegExp の一致

正規表現 Match メソッドは scan と非常によく似ていますが、すべての一致ではなく、一致の最初のインスタンスを検索します。 @result =str.scan(regex) を @result =str.match(regex) に変更して、違いを確認してください。 

str1:result = rain

str2:result = Hertford

ただし、Match は オブジェクトを返します。結果を使用するときにロジックで使用できるメソッドがいくつか関連付けられています。そこで使用できるものの詳細については、Ruby ドキュメントを参照してください。 

グレップ

Grep は、配列内で一致する文字列を検索するための列挙可能なメソッドです。正規表現に一致するすべての文字列の配列を返します。私たちのコードでは、渡した文字列が配列に分割されていることを確認する必要があります。 

これを行うには、次のコード行を変更します。

@result = str.match(regex)

それを次のように変更します。

@result = str.split(/\s|,/).grep(regex);

Ruby で正規表現をマスターする:実践ガイド

「キャリア カルマは、私が最も必要としたときに私の人生に入り込み、すぐにブートキャンプに参加するのに役立ちました。卒業から 2 か月後、私は自分の価値観と人生の目標に合致する夢の仕事を見つけました。」

Rockbot のソフトウェア エンジニア、Venus 氏

ブートキャンプにマッチするものを見つけてください

最初の結果と同様の結果が得られます。 

str1:result = ["rain", "Spain", "main", "plain"]

str2:result = ["Hertford", "Hereford", "Hampshire"]

Str =~ 正規表現

=~ の使用 基本的な一致演算子を使用すると、文字列を正規表現と比較し、一致した最初のインデックスを返すことができます。一致しない場合は nil を返します。 

結論

この記事では、Ruby で正規表現 (RegEx) を使用する方法について説明しました。 Ruby で何を構築できるかについて詳しく知りたい場合は、記事「Ruby コードは何に使用されますか?」を参照してください。 」

Ruby を学習するためのより良い方法が必要ですか? Career Karma は、 あなたにとって最適なトレーニング プログラムを見つけるお手伝いをいたします。


  1. Rubyでプレフィックスツリーを実装して使用する方法を学ぶ

    プレフィックスツリー(トライとも呼ばれます)は、単語リストを整理し、特定のプレフィックスで始まる単語をすばやく見つけるのに役立つデータ構造です。 たとえば、「cat」や「cape」など、「ca」で始まるすべての単語を辞書で見つけることができます。 この写真を見てください: これはプレフィックスツリーです。 ルートからフォローできます( * )マークされたノード( e など) およびt )単語を見つける。 この記事では、Rubyで独自のプレフィックスツリーを実装する方法と、それを使用して問題を解決する方法を学習します。 プレフィックスツリーの実装 これをRubyに実装するため

  2. Railsのセキュリティの脅威:認証

    このシリーズのパート1、インジェクションアタックについて説明しました OWASPトップ10Webアプリケーションセキュリティリスクに関するシリーズの2番目の記事では、認証の失敗とデータ漏洩の脅威の世界に飛び込みます。 具体的には、ハッカーが作成したコードをだまして攻撃を実行し、ユーザーのデータを取得するのがいかに簡単かについて説明します。 ユーザー列挙 :データベースに存在するかどうかを確認するためだけに、可能性のあるユーザーのリストをブルートフォーステストしてログインページを悪用した場合。 弱いパスワード :システムで弱いパスワードが許可されている場合、ハッカーはブルートフォース攻撃を