どこで学ぶべきかを尋ねているのではありません。私はオンラインでたくさんの良いリソースと本などを見つけました。
しかし、私はそれらにどのように取り組んでいますか。それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等
エジプトのピラミッドの象形文字を理解しようとしている気がします。
どこで学ぶべきかを尋ねているのではありません。私はオンラインでたくさんの良いリソースと本などを見つけました。
しかし、私はそれらにどのように取り組んでいますか。それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等
エジプトのピラミッドの象形文字を理解しようとしている気がします。
回答:
オートマトン理論の知識は理解のために重要だと思います。
オートマトンとは何か、そして正規言語がどのように定義されているかを理解すれば、正規表現を理解するのははるかに簡単になります。
特定の構文とさまざまな実装間の違いについて...覚えておかなければならないことがいくつかあります。そのための補助もあります。
編集
以下のコメントのいくつかは重要なポイントを提起しました:
正規表現(ほとんどのプログラミング言語で実装されている)は、オートマトン理論における正規表現のスーパーセットであることを忘れないでください。優れた理論的背景は出発点として有用ですが、すべてを説明するわけではありません。(David Thornleyに感謝)
複数のコメンターは、理論的基礎を学ぶことなくさまざまな正規表現構文を学ぶことが可能であると言います。構文がどのように機能するかを完全に理解することなく学習できることは事実ですが、完全に理解することがOPの目的であるという印象を受けました。質問は実際の基礎に関するものでした:プロセッサーはいつ進歩しますか いつ停止しますか?どのように一致すると判断しますか?それが基礎であり、それが理論であり、オートマタ理論に基づいています。確かに、エンジンの仕組みを知らなくても車を運転できます。しかし、「ガスが実際にどのように駆動するのか」と尋ねられた場合、エンジンの構築方法について話さなければなりませんよね?
練習することにより。
Webスクレイピングを楽しんで学んだ。楽しみのためだけにそれをやっていたのではないでしょう。
1つの例:お気に入りのスポーツWebサイトから最新のサッカー、テニス(実際に好きなスポーツ)のスコアを取得するコードを作成します。ページをロードするコードを作成し、正規表現を使用してスコアを抽出し、コンソールまたはテキストファイルに出力することで実行します。選択した正規表現では、スコアのみを取得し、それ以外は取得しないようにしてください。時にはこれは非常に難しい場合があります:-)
2番目の例:お気に入りのWebコミックの画像を取得するコードを作成し(たとえば、Sinfestが大好きです)、ハードドライブのどこかに保存します。「img」タグとそのコンテンツを取得するには、正規表現のみを使用してください。オプションで、どこかに保存されている場合はタイトルも取得します。
あなたがリソースを求めているわけではないことは知っていますが、Jeffrey EF FriedlによるMastering Regular Expressionsは、それらがどのように機能し、どのように使用されるかを学んだ方法です。それらの多くを使用してさまざまなものを解析するようになった後でも、最初の章には新しいものがありました。
これらの正規表現を理解したいですか?この本を読んでください。
それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等
私がすることから始めますあなたの目標を明確にして、あなたの学習スタイルを考え出します。
あなたの質問について私を驚かせたのは、「どのように正規表現を学ぶのですか?」という質問です。そして、すぐに「正規表現エンジンはどのように内部で機能するのか?」という質問でそれに続きます。あなたは、これら二つのことは互いに関係があることを暗示しているように見えます。これは重要なポイントです。たぶん、あなたは何かを分解するか、自分で構築することによって何かがどのように機能するかを学ぶ人かもしれません。
初心者のアプリケーションの場合、通常、ツールを効果的に使用するためにツールがどのように機能するかを理解する必要はありません。木材に穴を開けるためにドリルモーターがどのように機能するかを知る必要はありません。ドリルの作成方法ではなく、ドリルの使用方法を理解する必要があります。
それで、あなたの目標は何ですか?正規表現エンジンの構築方法を学習するつもりですか?または、正規表現を効果的に使用してビジネス上の問題を解決する方法を学習するつもりですか? これらの異なる目標を達成するには、おそらく異なる学習テクニックが必要です。
正規表現エンジンがどのように機能するかについての特定の質問に対処するには、それは依存します。正規表現に対する「古典的な」理論的アプローチは、非決定性有限オートマトンの青写真として正規表現を使用し、同等の決定性有限オートマトンを構築してから、入力に対してそのオートマトンを実行することです。
いくつかの理由で実際にこれを行う人はほとんどいません。まず、状態の数に可能な入力文字の数を掛けると、小さな正規表現でも非常に大きな状態遷移表が生成されます。もちろん、そのほとんどは圧縮できますが、それでも多くの移行ルールです。第二に、他のアプローチは通常より高速です。第三に、いわゆる「正規」式は現代の正規表現ライブラリにあり、種類はありません。それらは通常の言語ではありません。多くの場合、有限オートマトン言語ではなく、プッシュダウンオートマトンによって認識されます。
(これらすべての仕組みについての長いシリーズを書き始めましたが、最初の12件の記事を読んだだけで勢いがなくなりました。基本的な正規表現の理論的背景についての簡単な入門書が必要な場合は興味深いかもしれません。)
代わりに、実際の正規表現エンジンは通常、バックトラッキング戦略を使用します。10年以上前にJScriptエンジン用に構築した正規表現エンジンは、シーケンスを認識し、以前の状態に戻るためのプリミティブを含むバイトコード言語に正規表現をコンパイルします。次に、そのバイトコード言語用のインタープリターを作成しました。
私は、正規表現エンジンがする方法のかなりしっかりと理解持つ前に、どのように動作するかを理解しようとしないだろう使用正規表現を。さまざまなエンジンの最適化戦略を掘り下げる前に、それに集中してください。
"[0-9]{3}"
3桁の数字に一致する正規表現、そして3桁の数字480は正規の例です一致する表現。
どのようにそれらに取り組むのですか?
新しいもののように:
10 Study
20 Practice
30 goto 10
ほとんどの成功した教師は、まず科目の背景を少し教えてから科目を教えるようになります。何を学んでいるか、そして最も重要なのはなぜ学んでいるのかというコンテキストを把握することが重要です。
正規表現は、テキスト内のパターンを照合する手段です。これは、宣言型言語そのものであり、他の多くのプログラミング言語に組み込まれています。
宣言型言語であり、正規表現は一致する文字列を表現するのに便利ですが、プログラムがどのように一致するかを表現するものではありません。このため、異なるRegExパーサーを使用するだけで、同じプログラミング言語で非常に迅速かつ非常にゆっくりと正規表現を使用できます。
正規表現を作成する理由は、ほとんどのプログラミング言語を作成する場合と同じです。プログラマーは、同じ複雑なタスクを何度も実行していることに気付き、より簡単なコード記述方法が必要だと判断しました。
一部の人は、次の行に沿って何かを言うことで私の前の文について文句を言うでしょう(そしてそうすべきです)。
それは本当です
正規表現はしない、正規表現が作るプログラムはどのシンプルに書くプログラムを簡素。すべての正しいケースが正しく一致し、すべての誤ったケースが一致しないことを確認するには、テストを徹底する必要があります。「すべて」をテストするのは非常に難しく、複雑なパターンでは「ほとんど」をテストするのは非常に困難です。最悪の場合でも、「一部の」ケースをテストする必要があります。
ブラウザで簡単にライブでテストでき、RegExリテラルの使用中に文字列をエスケープする必要がないため、JavaScriptのRegExエンジンを義務的に選択したいくつかの例を組み込むことができます。
通常の文字列照合を行う場合、ある文字列値を別の文字列値に対してテストします。彼らはどこからでも来ることができますが、最終的には互いに比較される2つの文字列が必要です:
if ( 'foo' == 'bar' ) doSomething();
それは何もしないので、その例は嫌です
if ( foo == 'bar' ) doSomething();
ずっといい; 現在、実際に何かが行われるかどうかはわかりません。ユーザー入力の受け入れを開始できます。
if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();
素晴らしい、今ではユーザーが入力できbar
、何かが起こります。ユーザーからバグレポートを受け取るまで"bar"
、「バー」が機能していない、または「BAR」がBRA
100回入力しても何も起こらないという報告があります。
スペルミスや余分な文字を無視する'bar' != 'BAR'
、およびプログラマーは、文字のどこが間違っているかをテストする方法を考える必要があります。
シンプルなソリューション、使用しますtoLowerCase
。それは素晴らしく機能しますが、マッチングするときにアメリカ英語よりもイギリス英語を使用しているユーザーはsomething == 'color'
どうでしょうか?今、あなたは一致する必要がありますsomething == 'color' || somthing == 'colour'
。
長い話、短くシンプルなパターンは、非常に迅速に多くの反復コードに変わります。
色の例は、次のものと簡単に一致させることができます。
/colou?r/.test( something )
正規表現の基本をしっかりと理解することで、ホイールの再発明に費やす時間を大幅に削減できます。
正規表現を実装するほとんどの言語には、その言語内で正規表現を使用する特定の構文に使用できるリソースが少なくとも1つあります。JavaScriptの 1つはMDNにあります
それを読んで。
それのすべて。
もう一度読んでください。
学習には時間がかかり、投資と考えてください。RegExを学習するのに1時間かかると、次に文字列パターンマッチングを行う必要があるときに1時間節約できます。
RegExについてすべて読んだ後、おそらくそのほとんどを理解できないでしょう。それはあなたが実際にそれで何もしていないからです。
この例でJSを選んだ理由を述べましたが、ブラウザでJSを混乱させることをお勧めします。それは迅速であり、URLバーでそれを行うことができます。
JSには、RegExを使用するいくつかの異なる単純な方法があります。
string.match( regex )
regex.exec( string )
regex.test( string )
次のような単純なものから始めます。
javascript:'color'.match(/colou?r/);
ドアに足を踏み入れる簡単な方法です。試してみて、一致するものと一致しないものを確認してください。
練習が行き詰まったら、に進み30
ます。あなたはもっと学ぶために読む必要がありますが、あなたが学んだことを本当に理解するために練習する必要があります。
Brian Kernighanは、本Beautiful Codeに簡単な正規表現プロセッサーを書いています。リソースを探しているわけではありませんが、内部で基本的な実装を確認すると役立つ場合があります。
通常の開発では、コードのデバッグは非常に有用な洞察を提供できます。正規表現にも違いはありません。だから、広告のように聞こえるリスクがあるので、RegexBuddyを入手してください。式と入力文字列を処理するエンジンが実行していることを視覚的に表示するための優れたツールがあります。
正規表現はすぐに非常に複雑になる可能性があるため、チュートリアルを使用して学習を開始することをお勧めします。正規表現の最も単純な形式は、検索対象を表す文字列であることに注意してください。残念ながら、特別な検索ルールを定義するには特定の文字が必要であり、これらの文字をエスケープする必要があります。そうしないと、無効または不正な正規表現が作成されます。
私のアドバイスは、あなたが探しているものの例から始めて、それを逃れることです。つまり、かっこ内の何かを探している場合は、検索しているテキストでそのような文字列の例を取り上げます。 (this is an example of something you'd want to find)
文字をエスケープすることから始めて、リテラル文字を検索します。
\(this is an example of something you'd want to find\)
テストし、サンプルが正しく検出されることを確認します。次に、式を一般化して、見つけた例だけでなく、そのようなテキストを見つけます。したがって、次のようになります:
\([^)]*\)
(0を含む任意の数のオカレンスに対して、「ではない」任意の文字を意味します)。
もう一度テストして、あなたの例を見つけるだけでなく、他の人がそれを好むことを確認してください。インターネット上でより複雑ではあるがより頻繁な正規表現を検索し、既存の正規表現でパッチを適用して、あらゆる可能性を心配する必要をなくします。
それについてです。そして、ああ、学んで、\ Q ... \ Eが大好きです。ほとんどの正規表現言語では、特に洗練されたパターンの検索に対処する必要があり、それらをエスケープする方法がわからない場合に備えて、\ Qはリテラルパターンの開始を示し、\ Eは終了を示します。それは数回の機会よりも私の命を救った。
簡単な質問に対する簡単な答えをあげます。まず、正規表現(RegEx)が何であるか、何をするのか、何に使用するのかを理解する必要があります。次に、開始するための優れたツール。
それは何ですか?RegExは、パターンマッチングを表現するための言語です。つまり、それを使用して、テキストのパターンを認識または検索する文字の組み合わせを作成できます。これはどのように役立ちますか?プログラミングでは、コンピューターにソース(ユーザー入力、Webページなど)からのテキストを照合し、特定のテキストが含まれているかどうかを検出するように指示できます。たとえば、ピリオド(。)は任意の文字(文字または数字)を表します。中括弧内の数字は反復回数を表します。そのため、「。{1,30}」は1〜30回繰り返される任意の文字を示します。つまり、空の文字列を含めることはできず、30文字以下にすること文字。そして、それはそこから続きます。
学習を始めるには?私が見た絶対的な最高のツールはExpressoですが、それはWindows専用です。式に追加する要素をクリックして、テスターがさまざまな入力に対してチェックして結果を確認する非常に広範なGUIがあります。私はMacで良いことを何も見ていません(しかし、VMWareでWindowsを実行しているので、実際にMacバージョンは必要ありません)。
優れたリファレンスに加えて、実際に学習する方法は優れた学習ツールを使用することです。1つは、2つのオプションを設定したオープンソースのVimエディターを使用する方法です。
もう1つは、RegExCoachを呼び出す無料のツールを使用することです。検索するテキストを貼り付け、別のウィンドウで正規表現を作成します。Vimと同様に、成功した試合をその場で強調します。
基本的な文字列の比較から始めます。非常に簡単ですが、強力でもありません。
次に、「greek」と「GreeK」が等しく比較されるように、大文字と小文字を区別しない比較が必要な場合があります。これはもう少し強力です。
ある日、つづりの小さな違いに気づいたら、2つの単語が等しく比較されることを妨げてはなりません。あなたは座って、これを行うコードを書いて、あなたは幸せです。
少し抽象化し、「ize」で終わるすべての単語を、イギリスのスペルの兄弟と同等にしたい場合があることに気付くまで。または、いくつかの文字列の一定の回数の繰り返し。そして、もちろん、あなたはそれらすべてを組み合わせる必要があります。
等々。最後に、すべての文字がそれ自体を表すわけではない表記法になります。他に正規表現はありません。文字列セットの説明として見ることができます。
そして、それはかなり簡単で、次の3つの基本原則に帰着します。
基本的な正規表現があります。大文字を表す\ dや\ p {Lu}のような文字クラスの略称。
そして、それらを組み合わせる可能性がいくつかあります。r1とr2が正規表現である場合、r1r2 r1 | r2(r1)も正規表現です。
最後になりましたが、繰り返し修飾子:r?r * r + r {n、m}
これはあなたが知る必要があるほとんどです。必要なときに参照できるその他のもの。
提供できるものはすべて、学ぶためのリソースです。この質問自体がリソースです。
ところで、私はこのサイトから非常に簡単に正規表現を学びました:http : //www.regular-expressions.info/
字句解析器と構文解析器を構築するために使用されるflexとbisonを学ぶことで正規表現を学びました。正規表現なしではパーサーを作成することはできませんでした。本lexxとyaccは、速すぎずに理論を詳しく説明するのが得意です。
基本的に、最近のほとんどすべての正規表現エンジンは同じ原則に従っています。それらはすべて有限状態マシンであり、それを本当に理解していれば、作成するほとんどすべてのコードに足を踏み入れることができます。再帰を学ぶことに似ていますが、それを取得したら、それを本能的に問題に適用します。適切なツールで簡単に解決できますが、それなしでは非常に困難です。
正規表現と比較して、lexxとyaccの学習に関するもう1つのことは、それらが内部でどのように機能するかを学習することです。プログラムがどのように先を見るか、なぜマッチを終了するか、データをどのように保持するかなど。ポインターを理解することは絶対必要です。しかし、lexxとyaccを入手し、最初からやり直せば、あなたが求めたすべてを学び、残りのキャリアのための非常に強力なツールを手に入れることができます。
この質問には、学習のための多くのリソースと、私が一緒に投入したフレックススケルトンが含まれます。
もう、私は最初に問題を解決する/文字列を「トークン化する」簡単な方法がないことを確認しようとします。
見つからない場合は、文字列から必要なものと一致させようとするのではなく、望ましくないものと一致させないという問題と見なします。これは主に正規表現が貪欲であるためです。しかし、それは私が欲しいものを手に入れるためのアプローチとして役立っています。
以下に例を示します。
string = "Sep 22 19:57:38 host fcron[9137]: \
Job fbsetbg -r $HOME/backgrounds/ \
started for user user (pid 9138)"
分に合わせて:
string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/ # correct and good
他のすべてと一緒に時間を見つけようとする代わりに、明確な境界を見つけようとします。
この例は少し工夫されていますが、思いつくことのできるものすべてです。
私が使用したアプローチの1つは、構文の更新を必要とする多数のオープンソースプロジェクトを見つけて、多くの正規表現で構成されたますます複雑なsedスクリプトを書くことでした。
スクリプトは、各オープンソースプロジェクトの多くの異なるファイルに対して実行する必要がありました。その後、さまざまなスタイルのさまざまなプロジェクトに対して実行します。私は非常に単純なものから始め%s/before/after
たので、多くの場合に一致することがわかりました。それを防ぐためにもっと多くのものを追加しました。その後、さまざまな変更を必要とするさまざまな構文スタイルを使用するさまざまなプロジェクトを見つけました。
最終的に私はで終わった
そして、このアプローチの助けになりました
また、さまざまな言語(ルビー、javascriptなど)のサイトがたくさんあり、すぐに満足できるように式やサンプルテキストをいじることができます。これらは:
1つのサイトで複数の言語の正規表現
マッチグループに焦点を当てる:
乗算表の学習に似た正規表現の学習を発見しました-はい、その背後にあるアイデアを理解する必要がありますが、最終的には、何度も繰り返し行う必要があります。
私が学んでいたとき、私は自分自身に1日にいくつかの正規表現演習を行うという目標を設定していました。実際には、これは少なくとも1日に1回、画面上の文字列またはテキストを見て、「ここからすべての電子メールアドレスを取得できますか」または「すべての「コード」という単語の出現は、名詞ではなく動詞として使用されます。」
数週間それをすることは本当に報われました-そしてもちろん、定期的なレビューと復習が必要です。私はそのうちの1つです。
リアルタイムで正規表現をテストできるので、このオンラインツールも役立つことがわかりました:http : //www.gethifi.com/tools/regex