正規表現をどのように学習しますか?[閉まっている]


80

どこで学ぶべきかを尋ねているのはありません。私はオンラインでたくさんの良いリソースと本などを見つけました。

しかし、私はそれらにどのように取り組んでいますか。それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等

エジプトのピラミッドの象形文字を理解しようとしている気がします。


2
ソートの話題に- regular-expressions.info。これと以下の@Jalaynの提案を使用してください。行うことによって学びます!
フライハイト

6
gskinner.com/RegExrは、私が見つけた正規表現を開発するための最良のツールです。
カラムロジャース

少しずつ。単純なもの(「aaa」、「aa。」、「a * b」など)から始めて、実装固有のコンポーネント(つまり、PCRE)に進みます。次に、パターンを考え出し、それに合った正規表現を作成してください。
タイラー

素晴らしいプログラムRegexBuddyで試行錯誤を繰り返しました。regexbuddy.com(これを宣伝しても信用を得られません。このプログラムは本当に簡単に習得できました)
ヤムマルコビッチ

rubular.comは正規表現を開発するための優れたツールです。
ガズラー

回答:


68

オートマトン理論の知識は理解のために重要だと思います。

オートマトンとは何か、そして正規言語がどのように定義されているかを理解すれば、正規表現を理解するのははるかに簡単になります。

特定の構文とさまざまな実装間の違いについて...覚えておかなければならないことがいくつかあります。そのための補助もあります。

編集

以下のコメントのいくつかは重要なポイントを提起しました:

  1. 正規表現(ほとんどのプログラミング言語で実装されている)は、オートマトン理論における正規表現のスーパーセットであることを忘れないでください。優れた理論的背景は出発点として有用ですが、すべてを説明するわけではありません。(David Thornleyに感謝)

  2. 複数のコメンターは、理論的基礎を学ぶことなくさまざまな正規表現構文を学ぶことが可能であると言います。構文がどのように機能するかを完全に理解することなく学習できることは事実ですが、完全に理解することがOPの目的であるという印象を受けました。質問は実際の基礎に関するものでした:プロセッサーはいつ進歩しますか いつ停止しますか?どのように一致すると判断しますか?それが基礎であり、それが理論であり、オートマタ理論に基づいています。確かに、エンジンの仕組みを知らなくても車を運転できます。しかし、「ガスが実際にどのように駆動するのか」と尋ねられた場合、エンジンの構築方法について話さなければなりませんよね?


コメンター:この質問のより細かい点について議論したい場合は、チャットを使用してください。そうでない場合は、回答を残すか、最も正しいと思われる回答に投票することを検討してください。

編集してくれてありがとう。これにより、この答えは真実により近くなります。オートマトン理論を本当に知る必要があるとはまだ思いませんが(それはわかりませんが、複雑な正規表現を書くことはできます)、理論のある程度の知識が役立つかもしれません。特に、バックトラッキングがどのように機能し、貪欲/非貪欲/強欲な数量詞によって制御されているかを知ることは、あなたの理解に本当に役立つかもしれません。
NikiC

ちょうど私の2セント:MSDNのChannel 9のC ++ STL正規表現ライブラリに関する最近のビデオシリーズで、プレゼンターはSTLのメンテナーでもあり、オートマトンとして実装すると述べています。そのため、この理論を知ることで、OPに正規表現がどのように機能するかについての洞察を本当に与えるはずです。
コルベス

5
冒頭の声明にはまったく同意しません。正規表現を学んだとき、オートマトン理論については何も知りませんでした。30年後、私はまだしません。私が知っていたのは、manページの読み方、文字通りそれを取る方法、プロンプトで実験する方法でした。
ブライアンオークリー14

1
@Bryanまあ...あなたの経験がポイントを証明します。あなたは多分それを使用する方法を知っていますが、それがどのように機能するかを本当に理解していません。あなたがそうするなら、あなたはそれを命名することを知らなくても、オートマトン理論について何かを知っています。しかし、オートマトン理論を知らずに正規表現を完全に理解することはできません。また、マニュアルページを読むことは役に立ちません(もちろん、オートマトン理論について説明しているマニュアルページを読んでいない限り)。
littleadv 14

36

練習することにより。

Webスクレイピングを楽しんで学んだ。楽しみのためだけにそれをやっていたのではないでしょう。

1つの例:お気に入りのスポーツWebサイトから最新のサッカー、テニス(実際に好きなスポーツ)のスコアを取得するコードを作成します。ページをロードするコードを作成し、正規表現を使用してスコアを抽出し、コンソールまたはテキストファイルに出力することで実行します。選択した正規表現では、スコアのみを取得し、それ以外は取得しないようにしてください。時にはこれは非常に難しい場合があります:-)

2番目の例:お気に入りのWebコミックの画像を取得するコードを作成し(たとえば、Sinfestが大好きです)、ハードドライブのどこかに保存します。「img」タグとそのコンテンツを取得するには、正規表現のみを使用してください。オプションで、どこかに保存されている場合はタイトルも取得します。


15
正規表現を使用してHTMLを解析することは、一般的に悪い考えです。
Maxpm

10
もちろん、それは悪い考えです。DOM / Saxパーサーまたは他の専用XMLリーダーを使用することが、「一般的に」使用されるべきものです。ただし、ここでのトピックは正規表現の学習に関するものであり、「楽しい」と思った方法で正規表現について学んだことを共有しました。
ジャレイン

3
HTMLのWebページにXMLパーサーを使用することは、正規表現でそれらをスクレイピングすることよりも悪い考えです。
スコリマ

8
ああ、私はそれについて考えたことをより正確にしたかったのですが、私は怠け者で、コメントに反応しました... 1.正規表現を使用してドキュメント全体を解析するのは悪い考えだと思うでしょう。 2. XMLパーサーを使用してHTMLを解析するのは悪い考えです3. XMLパーサーを使用してXHTMLを解析するのは正しい4.正規表現を使用してHTMLからワンライナーまたは非常に特定の情報を取得するのは正しい または、私はそれを要約するかもしれません:適切な仕事のための適切なツール
...-Jalayn

23

あなたがリソースを求めているわけではないことは知っていますが、Jeffrey EF FriedlによるMastering Regular Expressionsは、それらがどのように機能し、どのように使用されるかを学んだ方法です。それらの多くを使用してさまざまなものを解析するようになった後でも、最初の章には新しいものがありました。

これらの正規表現を理解したいですか?この本を読んでください。


2
これが決定的な答えになるはずです。
スリム

1
+100,000史上最高の技術書の1つで、質問のトピックに関する便利なものです。
Affe

この本が気に入りました。キーポイントは、正規表現で利用可能なすべての異なる機能を理解するのに役立ったことです。本を読んでからすべての構文を記憶することはできませんが、本は存在するすべてのものを表示するので、問題が発生したときにどのツールを解決する必要があるかがわかります。
キブビー

この答えは絶対に+1です。最終的に座ってこの重要な巻を一行一行読むまで、正規表現に飛びついた。Friedlは、今日私たちを悩ませている多くの非標準的なバリエーションのすべてを通して、自分の道を推理できるほどの基盤を与えてくれました!この参照をOPおよび他のすべての人に強くお勧めします。@slimのコメントも+1してください!
ジョンTOBLER

19

それの始まり、終わりはどこですか?正規表現プロセッサはいつテキストを進めますか、いつスタンドを保持して別の一致を試みますか?等

私がすることから始めますあなたの目標を明確にして、あなたの学習スタイルを考え出します

あなたの質問について私を驚かせたのは、「どのように正規表現を学ぶのですか?」という質問です。そして、すぐに「正規表現エンジンはどのように内部で機能するのか?」という質問でそれに続きます。あなたは、これら二つのことは互いに関係があることを暗示しているように見えます。これは重要なポイントです。たぶん、あなたは何かを分解するか、自分で構築することによって何かがどのように機能するかを学ぶ人かもしれません。

初心者のアプリケーションの場合、通常、ツールを効果的に使用するためにツールがどのように機能するかを理解する必要はありません。木材に穴を開けるためにドリルモーターがどのように機能するかを知る必要はありません。ドリルの作成方法ではなく、ドリルの使用方法を理解する必要があります。

それで、あなたの目標は何ですか?正規表現エンジンの構築方法を学習するつもりですか?または、正規表現を効果的に使用してビジネス上の問題を解決する方法を学習するつもりですか? これらの異なる目標を達成するには、おそらく異なる学習テクニックが必要です。

正規表現エンジンがどのように機能するかについての特定の質問に対処するには、それは依存します。正規表現に対する「古典的な」理論的アプローチは、非決定性有限オートマトンの青写真として正規表現を使用し、同等の決定性有限オートマトンを構築してから、入力に対してそのオートマトンを実行することです。

いくつかの理由で実際にこれを行う人はほとんどいません。まず、状態の数に可能な入力文字の数を掛けると、小さな正規表現でも非常に大きな状態遷移表が生成されます。もちろん、そのほとんどは圧縮できますが、それでも多くの移行ルールです。第二に、他のアプローチは通常より高速です。第三に、いわゆる「正規」式は現代の正規表現ライブラリにあり、種類はありません。それらは通常の言語ではありません。多くの場合、有限オートマトン言語ではなく、プッシュダウンオートマトンによって認識されます。

(これらすべての仕組みについての長いシリーズを書き始めましたが、最初の12件の記事を読んだだけで勢いがなくなりました。基本的な正規表現の理論的背景についての簡単な入門書が必要な場合は興味深いかもしれません。)

代わりに、実際の正規表現エンジンは通常、バックトラッキング戦略を使用します。10年以上前にJScriptエンジン用に構築した正規表現エンジンは、シーケンスを認識し、以前の状態に戻るためのプリミティブを含むバイトコード言語に正規表現をコンパイルします。次に、そのバイトコード言語用のインタープリターを作成しました。

私は、正規表現エンジンがする方法のかなりしっかりと理解持つ前に、どのように動作するかを理解しようとしないだろう使用正規表現を。さまざまなエンジンの最適化戦略を掘り下げる前に、それに集中してください。


+1は、正規表現を使用するときに知っておくと便利ないくつかのことに対処するためです。ただし、内部を知る必要はないというあなたの判断には同意しません。掘削については、あなたは完全に正しいです。コンピューターでは、C ++(コンパイラー)、Webサーバー(HTTP)、または正規表現(オートマトン理論)を問わず、アプリケーションをマスターするために何かを内部で理解しなければならない点に、最初に思ったよりも早くなった。私が専門家になるまでではありませんが、多くの場合、基礎となる原則を十分に理解することが最も簡単な学習方法です。
フェリックスDombek

3
@Felix:私たちは実際に同意すると思います。私が言ったことを、初心者のためのアプリケーションが存在しない通常のツールはそれを使用するためにはどのように動作するかを理解する必要が。これらのイタチの言葉は意図的でした。以下のために職人見事ツールが悪いパフォーマンスを持っているだろう場所を正確に予測できるように、その内部に関する少なくとも何かを理解することは非常に有用であるツールを使用する、と言います。
エリックリッパー

うーん、私はいくぶん反対する必要があります。私が構築した最も有用なビジネスプログラムのいくつかは、lexxとyaccで学んだ理論を使用して問題を効率的に解決しました。ただし、完全なphdレベルの理解は必要ありません。私はブログの投稿を読む必要があります、彼らは最も興味深いように見えます。
スペンサーラスブン

あなたは正規表現は正規ではないと言います-しかし、名前の世界の正規表現はそれが一致する表現を参照していると思いました-例えば、"[0-9]{3}"3桁の数字に一致する正規表現、そして3桁の数字480は正規の例です一致する表現。
コンフィギュレー

1
@configurator:「通常の」言語とは、定義上、有限オートマトンが認識できる言語です。すべての通常の言語は、ユニオン、代替、カテネレーション、およびKleene Starのみで構成される「正規表現」によって特徴付けられます。しかし、最近のほとんどの「正規表現」エンジンは、通常の言語よりも複雑な言語を認識します。たとえば、「括弧が正しく一致する文」の言語は規則的ではありませんが、一部の正規表現エンジンでは「正規表現」と一致させることができます。
エリックリッパー

6

どのようにそれらに取り組むのですか?

新しいもののように:

10 Study
20 Practice
30 goto 10

調査

ほとんどの成功した教師は、まず科目の背景を少し教えてから科目を教えるようになります。何を学んでいるか、そして最も重要なのはなぜ学んでいるのかというコンテキストを把握することが重要です。

それはすべて文字列マッチングです

正規表現は、テキスト内のパターンを照合する手段です。これは、宣言型言語そのものであり、他の多くのプログラミング言語に組み込まれています。

宣言型言語であり、正規表現は一致する文字列を表現するのに便利ですが、プログラムがどのように一致するを表現するものではありません。このため、異なるRegExパーサーを使用するだけで、同じプログラミング言語で非常に迅速かつ非常にゆっくりと正規表現を使用できます。

正規表現を作成する理由は、ほとんどのプログラミング言語を作成する場合と同じです。プログラマーは、同じ複雑なタスクを何度も実行していることに気付き、より簡単なコード記述方法が必要だと判断しました。

一部の人は、次の行に沿って何かを言うことで私の前の文について文句を言うでしょう(そしてそうすべきです)。

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」がBRA100回入力しても何も起こらないという報告があります。

スペルミスや余分な文字を無視する'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ます。あなたはもっと学ぶために読む必要がありますが、あなたが学んだことを本当に理解するために練習する必要があります。


ブラウザーでJavaScriptをいじることを推奨する場合は+1。
ジョントブラー

5

Brian Kernighanは、本Beautiful Codeに簡単な正規表現プロセッサーを書いています。リソースを探しているわけではありませんが、内部で基本的な実装を確認すると役立つ場合があります。


前述の「正規表現プロセッサ」は、実際には分離を実装していません。また、指定されたアプローチでは、それらを追加するのは非常に困難です。私は本が好きですが、これは私が失望したことの一つです。
フェリックスDombek

4

通常の開発では、コードのデバッグは非常に有用な洞察を提供できます。正規表現にも違いはありません。だから、広告のように聞こえるリスクがあるので、RegexBuddyを入手してください。式と入力文字列を処理するエンジンが実行していることを視覚的に表示するための優れたツールがあります。


1
+1、「Regex Hero」も素晴らしい:regexhero.net/tester
アンジェロ

Regexbuddyは、私のお気に入りのツールの1つです。正規表現を生成するとすぐにテストできるので、ツリービューを見ると非常に役立ちます。使用するだけで学習しようとせずに、より多くの正規表現を学習しました。
チャオ

1
RegexBuddyは常に面白いと思っていますが、購入するのは嫌です。基本的な正規表現のテストには、他にも多くのユーティリティがあります。少数のツールがありますが、正規表現のテキストによる説明を表示します。Regex Heroの有料版も同様です。しかし、RegexBuddyにかなりユニークなものの1つは、キャラクターの受け入れまたは拒否のそれぞれを詳細に示すRegexデバッガーです。私はそれを行う他のツールに気づいていません。
ケビンキャスカート

3

正規表現はすぐに非常に複雑になる可能性があるため、チュートリアルを使用して学習を開始することをお勧めします。正規表現の最も単純な形式は、検索対象を表す文字列であることに注意してください。残念ながら、特別な検索ルールを定義するには特定の文字が必要であり、これらの文字をエスケープする必要があります。そうしないと、無効または不正な正規表現が作成されます。

私のアドバイスは、あなたが探しているものの例から始めて、それを逃れることです。つまり、かっこ内の何かを探している場合は、検索しているテキストでそのような文字列の例を取り上げます。 (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は終了を示します。それは数回の機会よりも私の命を救った。


3

簡単な質問に対する簡単な答えをあげます。まず、正規表現(RegEx)が何であるか、何をするのか、何に使用するのかを理解する必要があります。次に、開始するための優れたツール。

  1. それは何ですか?RegExは、パターンマッチングを表現するための言語です。つまり、それを使用して、テキストのパターンを認識または検索する文字の組み合わせを作成できます。これはどのように役立ちますか?プログラミングでは、コンピューターにソース(ユーザー入力、Webページなど)からのテキストを照合し、特定のテキストが含まれているかどうかを検出するように指示できます。たとえば、ピリオド(。)は任意の文字(文字または数字)を表します。中括弧内の数字は反復回数を表します。そのため、「。{1,30}」は1〜30回繰り返される任意の文字を示します。つまり、空の文字列を含めることはできず、30文字以下にすること文字。そして、それはそこから続きます。

  2. 学習を始めるには?私が見た絶対的な最高のツールはExpressoですが、それはWindows専用です。式に追加する要素をクリックして、テスターがさまざまな入力に対してチェックして結果を確認する非常に広範なGUIがあります。私はMacで良いことを何も見ていません(しかし、VMWareでWindowsを実行しているので、実際にMacバージョンは必要ありません)。


1
エクスプレスについてのヒントをありがとう。私はそれを試してみました、それは素晴らしいです!
ジムでテキサス州

3

優れたリファレンスに加えて、実際に学習する方法は優れた学習ツールを使用することです。1つは、2つのオプションを設定したオープンソースのVimエディターを使用する方法です。

  1. :set incsearch ...コマンドラインで検索パターンを入力すると、エディターは一致する最初のテキスト部分にオンザフライでジャンプし、一致するものを正確に強調表示します。何も一致しなくなるような何かを入力すると、Vimはカーソルを開始時の位置にジャンプさせます。
  2. :set hlsearch ...これは、現在のRE検索に一致するすべてのテキストにハイライトされた背景を表示するようにVimに指示します。

もう1つは、RegExCoachを呼び出す無料のツールを使用することです。検索するテキストを貼り付け、別のウィンドウで正規表現を作成します。Vimと同様に、成功した試合をその場で強調します。


RegExCoachはシェアウェアになりました。複雑なPerlスタイルのREを開発するのに非常に役立ちました。
ファーストロック

2

基本的な文字列の比較から始めます。非常に簡単ですが、強力でもありません。

次に、「greek」と「GreeK」が等しく比較されるように、大文字と小文字を区別しない比較が必要な場合があります。これはもう少し強力です。

ある日、つづりの小さな違いに気づいたら、2つの単語が等しく比較されることを妨げてはなりません。あなたは座って、これを行うコードを書いて、あなたは幸せです。

少し抽象化し、「ize」で終わるすべての単語を、イギリスのスペルの兄弟と同等にしたい場合があることに気付くまで。または、いくつかの文字列の一定の回数の繰り返し。そして、もちろん、あなたはそれらすべてを組み合わせる必要があります。

等々。最後に、すべての文字がそれ自体を表すわけではない表記法になります。他に正規表現はありません。文字列セットの説明として見ることができます。

そして、それはかなり簡単で、次の3つの基本原則に帰着します。

基本的な正規表現があります。大文字を表す\ dや\ p {Lu}のような文字クラスの略称。

そして、それらを組み合わせる可能性がいくつかあります。r1とr2が正規表現である場合、r1r2 r1 | r2(r1)も正規表現です。

最後になりましたが、繰り返し修飾子:r?r * r + r {n、m}

これはあなたが知る必要があるほとんどです。必要なときに参照できるその他のもの。


2

他の2つの良い答えは、正規表現の背後にある理論を学び、実践することを教えてくれます。どちらも素晴らしいアドバイスです。また、真剣な場合に役立つ視覚的な正規表現ツールを入手することをお勧めします。

たとえば、RegexBuddyには視覚的なデバッグモードがあり、正規表現の実行をステップごとに実行でき、ハイライトと説明テキストで正規表現エンジンが各ステップで実行していることを示します。彼らのサイトでこのデバッグ実演するビデオがあります。



1

私にとって、正規表現を作成するときに正規表現が一致するものを確認することは、私の人生をより簡単にし、それらをよりよく理解するのに役立ちました。

これを行うには、Emacsでターゲットテキストを含むファイルを開き、isearch-forward-regexpコマンドを使用します。正規表現を入力すると、Emacsは一致するものを表示します(「isearch」の部分)。

コマンドを実行するには、Emacsでを使用できます<ESC>xisearch-forward-regexp


1

字句解析器と構文解析器を構築するために使用されるflexとbisonを学ぶことで正規表現を学びました。正規表現なしではパーサーを作成することはできませんでした。本lexxとyaccは、速すぎずに理論を詳しく説明するのが得意です。

基本的に、最近のほとんどすべての正規表現エンジンは同じ原則に従っています。それらはすべて有限状態マシンであり、それを本当に理解していれば、作成するほとんどすべてのコードに足を踏み入れることができます。再帰を学ぶことに似ていますが、それを取得したら、それを本能的に問題に適用します。適切なツールで簡単に解決できますが、それなしでは非常に困難です。

正規表現と比較して、lexxとyaccの学習に関するもう1つのことは、それらが内部でどのように機能するかを学習することです。プログラムがどのように先を見るか、なぜマッチを終了するか、データをどのように保持するかなど。ポインターを理解することは絶対必要です。しかし、lexxとyaccを入手し、最初からやり直せば、あなたが求めたすべてを学び、残りのキャリアのための非常に強力なツールを手に入れることができます。

この質問には、学習のための多くのリソースと、私が一緒に投入したフレックススケルトンが含まれます。


1

もう、私は最初に問題を解決する/文字列を「トークン化する」簡単な方法がないことを確認しようとします。

見つからない場合は、文字列から必要なものと一致させようとするのではなく、望ましくないものと一致させないという問題と見なします。これは主に正規表現が貪欲であるためです。しかし、それは私が欲しいものを手に入れるためのアプローチとして役立っています。

以下に例を示します。

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

私が使用したアプローチの1つは、構文の更新を必要とする多数のオープンソースプロジェクトを見つけて、多くの正規表現で構成されたますます複雑なsedスクリプトを書くことでした。

スクリプトは、各オープンソースプロジェクトの多くの異なるファイルに対して実行する必要がありました。その後、さまざまなスタイルのさまざまなプロジェクトに対して実行します。私は非常に単純なものから始め%s/before/after たので、多くの場合に一致することがわかりました。それを防ぐためにもっと多くのものを追加しました。その後、さまざまな変更を必要とするさまざまな構文スタイルを使用するさまざまなプロジェクトを見つけました。

最終的に私はで終わった

  • 正規表現に関する優れたスキルと知識
  • sedの優れたスキル
  • 多くのオープンソースプロジェクトを支援
  • githubプロフィールに多くの貢献活動が表示される
  • 仮想ツールベルト用のもう1つの優れた「スイスアーミーナイフ」ツール

そして、このアプローチの助けになりました

  • カンニングせずに実際の目標を達成する
  • (正規表現)スキルを、より大きな目標の一部として、より高いモチベーションで使用します。
  • 他のコードを変更し、変更をレビューすることにより、私が学んだスキルの証拠を示すことができます。

また、さまざまな言語(ルビー、javascriptなど)のサイトがたくさんあり、すぐに満足できるように式やサンプルテキストをいじることができます。これらは:

1つのサイトで複数の言語の正規表現

マッチグループに焦点を当てる:


0

乗算表の学習に似た正規表現の学習を発見しました-はい、その背後にあるアイデアを理解する必要がありますが、最終的には、何度も繰り返し行う必要があります。

私が学んでいたとき、私は自分自身に1日にいくつかの正規表現演習を行うという目標を設定していました。実際には、これは少なくとも1日に1回、画面上の文字列またはテキストを見て、「ここからすべての電子メールアドレスを取得できますか」または「すべての「コード」という単語の出現は、名詞ではなく動詞として使用されます。」

数週間それをすることは本当に報われました-そしてもちろん、定期的なレビューと復習が必要です。私はそのうちの1つです。

リアルタイムで正規表現をテストできるので、このオンラインツールも役立つことがわかりました:http : //www.gethifi.com/tools/regex

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.