Caching
 

キャッシング - 正規表現(Zhuantie)

ロードの正規表現
gbvy[W
オリジナル:スティーブMansourさん
: June 5, 1999
(copied by jm /at/ jmason.org from after the original disappeared! )
翻訳:ネオさん




英語のテキスト
翻訳者の注意:元の古いので、テキストリンクの多くはすでに(主に約六、sedや他のツール、プレゼンテーションやマニュアル)有効期限が切れている、このようなリンクの翻訳が削除されており、表示するためのリンクこれらのリンクを確認してください上記のテキスト。。あなたは、中国語で書く場合は、コンテンツの問題であれば、もちろん、直接スティーブマンソーご連絡ください、あなたは私に連絡することができます。
ディレクトリ
正規表現とは何です





中間(魔法の呪文)
難しさ(信じられないほどの象形文字)
正規表現の中で様々なツール

正規表現は、式文字列のクラスと一致するパターンを使用することです。多くの人々の比較は、とても奇妙で複雑な使用しないように見えるので - 残念ながら、この資料では、変更することができません、しかし、少し練習した後、それから、またはこれらの複雑な表現を感じ始め、実際にかなり書いて簡単ですが、一度それらを理解し、あなたが完了するまで数分で圧縮されたテキスト処理の数時間、エラーが発生しやすいのハードワークを(偶数秒)置くことができます。。
我々は、正規表現の使用を説明するために、次の章にいくつかの例を使用しますが、例のほとんどはviテキストファイルの検索コマンドとgrepコマンドを記述する代わりに基づいていますが、彼らはの概念は、sedのできるすべての典型的な例であり、 awkは、perlの正規表現は言語をプログラミングするためのその他のサポート。あなたが正規表現の他の例で使用するには、このセクションでは、正規表現でさまざまなツールでいくつかのツールを調べることができます。viの置換コマンド(秒)の中国語版は、参考のために接続された単純なテキストの説明の後にもあります。。

。要素があるときは通常の文字のケースは、文字と数字を含む特別な文字を意味し、我々は以下の説明を与える。
最も単純なケースでは、正規表現は、一般的な文字列を探しています。たとえば、正規表現"テスト"は、それが他の文字列を"123testing"と"テスト"に一致する文字内の任意の要素が含まれていない"テスト"に一致することはできません。
。次の表は、すべてのメタ文字との簡単な説明が表示されますが。
メタ文字の説明
.
。たとえば、正規表現文字列rtを一致:ラット、わだち掘れ、rtのが、ルートと一致しない。
$
行の試合終了。たとえば、正規表現は、イタチを$文字列の末尾に"彼はイタチだ"に一致する文字列を一致させることはできません"彼らはイタチの集まりです。"。
^
。。
*
マッチ0またはより正確に、それを前の文字。たとえば、正規表現.*は任意の文字を使用できます任意の数と一致することを意味。
\
通常の文字のメタ文字が一致するように、これはここに記載されてされていた政府への参照です。。。
[ ]
[c1-c2]
[^c1-c2]
括弧内の任意の1文字にマッチ。たとえば、正規表現が[aou]のトンにマッチラット、腐敗し、マンネリ、しかし、RETを一致していないrを。。ブラケットの左側との間に^文字を使用して最初に - いわゆる補完されていること - もう一つの重要な使用に加えて、指定した範囲の文字の外側と一致するように、"除外"することです文字は、例えば、正規表現[^ 269A - Z]は、任意の文字以外の、2,6,9に加えて、すべて大文字に一致する。
\< \>
先頭(\未満)とend(\>を)に一致する単語(ワード)。たとえば、正規表現\ \( \)

|
2つのマッチの論理状態"、または"(OR)演算子。たとえば、正規表現(彼は|彼女)"それは彼に属している"とは、"それは彼女に属している"に一致することができないと一致する"それは彼らに属しています。"。注:このメタ文字は、すべてのソフトウェアでサポートされていない。
+
。たとえば、正規表現9 +マッチ9,99,999など。注:このメタ文字は、すべてのソフトウェアでサポートされていない。
?
。注:このメタ文字は、すべてのソフトウェアでサポートされていない。
\{i\}
\{i,j\}
前に式の、その定義にされている文字の一致する、指定された数。たとえば、正規表現[0-9] \ {3 \}は、A123電池、A348などの文字列を正確に3つの数字が続く文字"A"に一致するA1234と一致しない。。。
最も単純なメタキャラクタは、(改行を含んでいないことに注意してください)は、任意の単一文字と一致することができますポイントです。test.txtファイルがあることを、次の行が含まれていると:
he is a rat
he is in a rut
the food is Rotten
I like root beer
我々は正規表現をテストするためにgrepコマンドを使用することができますは、grepコマンドは、指定されたファイルの各行を一致させようとする正規表現を使用して少なくとも一つは、すべての行と一致する式を表示。
grep r.t test.txt
正規表現rtの各ラインの検索でTest.txtファイル、および印刷一致する行から。Rtは、いずれかの文字が続く正規表現rにマッチして、で続いて。。は、両方の大文字と小文字と一致する(角かっこ)文字範囲のメタ文字を使用するには。正規表現[Rrは]が両方のRとrと一致するように。[Rrは]:したがって、順序で大文字または小文字のrを一致するようにして任意の文字が続いて、この式を使用するのが続きます。 T。
。。
時には"× × ×すべての試合に加えて、"それは、例えば、彼は一致するが、前に除外"除外"を意味する回旋文字(^)は角括弧内に表示される目標を達成するために容易になるだろう指定状況は(つまり、彼女)TまたはSセックスが、あなたが使用することができます:[^ STは]を彼は。
あなたは複数の文字間隔を指定するには、括弧を使用することができます。たとえば、正規表現[à - Zaは- z]は、大文字と小文字を含む任意の文字に一致、正規表現[à - Za - z]で[à - Za - z]で*は、0個以上の文字(大文字が続く文字と一致または小文字)。。しかし、サポートされているすべてのメタ文字+プログラムは、正規表現をサポートすることに注意してください。この時点では、正規表現の構文をサポートケースの裏面を参照することができますで。
。使用することができる100のすべてのインスタンスを10万1000排除、一致するようにしたい:10 \ {2,3 \}、2、3 0モデルで数字の後に1にマッチする正規表現。有用な形質の変化に応じてこの要素の使用は、例えば、2番目の数字を、正規表現の0 \ {3 \}が一致する無視するようになって、少なくとも3つの連続した0。
簡単な例


:%のS / * / /スペースの1つまたは複数のスペースの代わりにg。
人:%S / * $ / /行の領域の末尾を削除する。
:%のS / ^ / /各行の先頭にスペースを追加する。

:%Sは/ロ/バグ/袋のすべてのgは、[aeio] gは、大きく、バグ沼請う。
:%のS / T \([aouの] \)G / Hが\ /、衣服、すべてのタグをgと綱引きは、帽子、ホット、そして抱擁(使用及び使用グループと\注1参照前に変更された1トン文字)が一致する。

例1
すべてのメソッドfooは(b、c)はインスタンスfooに(2、c)の。a、bおよびcは、()のパラメータを使用可能な任意のメソッドfooことができるところ。

foo(10,7,2) foo(7,10,2)
foo(x+13,y-2,10) foo(y-2,x+13,10)
foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)
これは、この魔法を達成するためには、次のコマンドを置き換えます:
:%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g
今では分割して分析してみましょう。基本的な考え方をお書きください。表現foo()およびそのブラケットの3つのパラメータの位置を特定することです。
[^は]を任意の文字コンマ以外に加えて、
[^,]* 0個以上の非コンマ文字

\ ([^,]* \)、我々は、カンマで続いて0個以上の非コンマ文字を見つける必要がある非コンマ文字の一部は、後で使用するためにマークする。
今では一般的なエラーがベストタイムは正規表現を使用することです。なぜ我々はのような、より単純で直接的な表現ではなく、[^,]*ような表現を使用するか:.*、最初のパラメータと一致している?私たちは、文字列"10,7,2"に一致するパターンを.*使用するとします、それが一致する必要があります"10"、または"10,7、"?例で最長の文字列に正規表現の規定に基づき、すべてで、この2曖昧さを(曖昧さ)、解決するには、上記のこれは、我々が期待つのパラメータを見つけることが明らかにされていない"、10,7"です。。。
。その後、我々は同じアプローチは、2番目の引数をマークする\ 2。番目のパラメータのマークは、同じ方法ですが、我々は右括弧までのすべての文字を検索する必要がある。我々はその位置を調整する必要がないため、私たちは、3番目の引数に検索する必要はありません我々はオーバーロードされてfoo()のfooのメソッド呼び出し()のこれら3つのパラメータを置き換えるだけでいることをこのようなモデルは、確保することができます(多くの保険の比較的明確なパターンです)メソッドをoveroading。。
例2
しかし、私たちに必要ないくつかの情報がありますCSV(カンマ区切り値)ファイルには、あると仮定します形式は、現在のデータ列の順序で、あるさ:名前、会社名は、州の略称、郵便番号、そして、今、私たちは、お話したいと思います - 郵便番号、会社名、名前、州の略称:これらのデータの再編成については、ために我々のソフトウェアのいずれかを使用するには、フォーマットが必要。。また、当社のソフトウェアは、(スペースとタブを含む)の前にカンマの後にスペースを受け入れることができない我々はまた、カンマの前後にすべてのスペースを削除する必要がありますので、。
ここでは私たちの現在のデータのいくつかの行は:
Bill Jones, HI-TEK Corporation , CA, 95011
Sharon Lee Smith, Design Works Incorporated, CA, 95012
B. Amos , Hill Street Cafe, CA, 95013
Alexander Weatherworth, The Crafts Store, CA, 95014
...
我々はこのようにしたい:
Bill Jones,CA 95011,HI-TEK Corporation
Sharon Lee Smith,CA 95012,Design Works Incorporated
B. Amos,CA 95013,Hill Street Cafe
Alexander Weatherworth,CA 95014,The Crafts Store
...
。。
ここでは交換の最初のコマンドは:
:%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/
ここでは本質的に実施例1、最初の列(名前)と一致するようにこの式を使用すると同じ方法です:\ ([^,]* \)、コンマの前にすべての文字を、使用するコンテンツの名前を、すなわち\ 1マークダウン。同じ方法で、会社名は、州の略称フィールドとして\ 2とマークされている\ 3一方、\(.* \)をと一致すると最後のフィールド("一致するすべての文字、行の最後まで")。。
交換は、次のコマンドは、スペースを削除するために使用されます:
:%s/[ \t]*,[ \t]*/,/g
分解我々が参照してください:[\ t]をマッチスペースを[\ t]を*は、[\ t]をする* /タブ、0個以上のスペースが一致する/タブが、、、/システムは最終的には、テーブルの休憩の後にカンマを追加する0個以上のスペースが一致する[\ t]を*は、[\ t]を*は0個以上のスペース/タブでコンマの後に続く0個以上のスペースを/タブと比較し、一致した。。ここでは、文字列内の各行には(最初にマッチした部分だけを交換する既定の文字列の代わりに)すべての置換の実行を一致していることを意味するオプションgパラメータの末尾を使用する。
例3
作品は、例えば、繰り返し複数の文字を考慮してください:
Billy tried really hard
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard

:%s/\(really \)\(really \)*/very /

Billy tried very hard
Sally tried very hard
Timmy tried very hard
Johnny tried very hard
式は\(実際には\)*は、(末尾のスペースに注意してください)0個以上連続して"本当に"に一致\(本当に\)\(実際には\)*に一致するつまたは複数の連続した"本当に"の例。
例の困難(信じられないほどの象形文字)
Coming soon.
正規表現の中で様々なツール
。だから、ここでは、REの使用例では、いくつかの他のツールを提供。加えて、私はREを使用しての間には違いがあります別の手順の概要を報告する。
。選択して[編集] - >交換し、"正規表現"チェックボックスを選択し、入力ボックスには、viコマンドに対応する上記のものが見つかりません:%はpat2のに対応するpat1部品や入力ボックスの置換部分をs/pat1/pat2/g。ただし、スコープとvi gオプションの実装を取得するためには、すべて置換、または適切な手を使用する必要がネクストと置換(翻訳のノートを探す:VCが選択することができますにもかかわらず、何人かの人々は、Microsoftのを遅らせ批判する理由を知っている範囲のテキストをクリックし、)ができるように、十分柔軟短くエレガントなviのは、彼らが置き換えを実行。
sed
sedは、頭字語は、一般的にはUnixで使用されているストリームエディタは、ファイルベースの編集ツールとのパイプを削除するsedの詳細については、マニュアルにすることができます。

sedスクリプトの説明
sedの'sは/ ^は、$ / d'のprice.txtは、すべての空白行を削除
sedの'sは/━^ [\ t]を$ / dの*'price.txtは、すべてのスペースまたはタブのみの行を含む削除

awk
awkはテキストデータの解析処理、複雑なために使用できるプログラミング言語です。。あなたは、awkの詳細については、取扱説明書を取得することができます。。
アホ、ワインバーガーとKernighanの本AWKプログラミング言語では、多くの良いAwkの例としては、次の簡単な例のスクリプトは、awkの力を理解する能力を制限させてくださいある。また、とsedで、我々はprice.txtファイルを扱うことを前提と端末に表示されるawkの結果のみ。
awkスクリプトの説明


Awkの'〜/ ^ [て、Jt] /'price.txt印刷のすべての番目のフィールドは番目のフィールドで始まるのJ'や'T'の行です
Awkの'! 〜/ [mm]との留学生/ {印刷+}雑貨を'すべての2番目のフィールドのprice.txtが含まれていない'または'misc'の行を、印刷、3と4(数字と仮定)
Awkの'! 〜/ ^ [0-9] + \。 [0-9] * $ 3行目の/'price.txt印刷は、すべてのフィールドの数字がまたはd 0から9までの任意の数であるような方法は、dにddを参照してください数ではない

grep
grepは使用つまたは複数のファイルまたは入力ストリームは、プログラムを再使用してそれを見つけることです。その名前はファイルの処理とパイプのためのプログラミング言語に使用することができます。。奇妙な名前は、グローバルな正規表現の印刷を意味する/再/ Pは同じ六からのコマンドは、g来る。
次の例では、我々はファイルには、次のテキストphone.txtが含まれていると - の形式は、カンマで、その名前、タブをクリックし、電話番号で家族の名前です:
Francis, John 5-3871
Wong, Fred 4-4123
Jones, Thomas 1-4122
Salazar, Richard 5-2522
grepコマンドの説明


はgrep'^ [JW]'phone.txt印刷すべての名前がJまたはWラインで始まる
はgrep'、... \ t'をphone.txtプリント4文字の行のすべての名前、メモ]タブは\ tを表明
はgrep - v'は^ [JW]'phone.txtは、JまたはWで始まるすべての行を印刷していない

はgrep'^ [Mzは] .*は[は12]'phone.txt印刷ZまでのMで始まるすべての名前との間の任意の文字、行の末尾にドットの数が1または2
egrep
egrepは、その正規表現のメタ文字の他の宿泊をサポートするためにはgrepの拡張版であり、。
Francis, John 5-3871
Wong, Fred 4-4123
Jones, Thomas 1-4122
Salazar, Richard 5-2522
egrep command Description
egrepは'(ジョン|フレッド)'phone.txt印刷のすべての名前がJohnまたはフレッドは行が含まれている
egrepは'ジョン| 22 $ | ^は、W'phone.txtまたはジョンが含まれている印刷するすべての22または行の末尾にWで
egrepは'ネット(仕事)? report.txtをからs'はreport.txtを、またはネットワークが含まれている行のすべてのネットを検索する


vi X X X X X
Visual C++ X X X X X
awk X X X X X X X X
sed X X X X X X
Tcl X X X X X X X X X
ex X X X X X X
grep X X X X X X
egrep X X X X X X X X X
fgrep X X X X X
perl X X X X X X X X X
はじめのviコマンドを置き換える
viの置換コマンド:
:ranges/pat1/pat2/g
どの

範囲が指定されたコマンドの範囲は、ドットを使用すると、すべての行のパーセント記号(%)を使用することができます()現在の行は、ドル記号($)を最後の行を使用することを。また、例えば、10,20のための、行番号を使用することができます最初の10から20行、最後の行に$それは現在の行。 2は、$ -5ことを示します5行目などまで、テキストの最後の二行の後に現在の行。

pat1は、この正規表現を見つけるためには、この資料の例が多い。
pat2のは、これは正規表現にパターン文字列と一致するように願っています、この資料の例が多い。
、それ以外の場合は、各試合のための文字列を置換する文字列の行の最初にマッチした部分だけを交換するラインのロゴと、オプションのフラグgの。


現時点では、正規表現は、アプリケーションソフトウェアの多くは、* nixの(Linux、Unix上など)、HPおよび他のオペレーティングシステムは、PHPは、C#、Java、および他の開発環境を含む、多くのソフトウェアアプリケーションで広くされていること正規表現の影を見ることができます。
正規表現の使用は、強力な達成するために簡単にすることができます。、それは非常に学ぶことは容易ではないシンプルで効果的かつ強力な、結果として得られる正規表現のコードではより困難については、それは、いくつかの努力にかかるが、それらは比較的簡単で効果的です使用して、参照への参照後に開始。

正規表現"の祖先は"いつもに遡ることができる方法を人間の神経系、初期の研究活動。ウォーレンマカロックとウォルターピッツ二神経生理学、神経ネットワークを記述する数学的な方法を開発しました。。
。正規表現は、彼が式"代数の定期的なセット"ですので、"正規表現"と呼ばれるかを説明するために使用される用語。
続いて、この作品の発見は、ケントンプソンの計算に適用することができる初期の検索アルゴリズムの研究の一部を使用して、Ken Thompsonは、Unixの主要な発明者である。正規表現はUnixのエディタで最初の実用的なアプリケーションは、QEDのです。

3。正規表現
正規表現は(正規表現)に一致または部分文字列から削除することにより、部分文字列が置換される文字列は、部分文字列が含まれているかどうかを確認するために使用できるパターンに一致する文字列を記述する条件をなどと一致します。。
ディレクトリは、dir *.アウトtxtまたはlsの*. txtの*. txtがある*と*正規表現の意味とは異なるため、正規表現ではない。
。テンプレートとしての正規表現、文字列パターンを照合することによって、検索。
3.1一般的な文字
。これは、すべての大文字と小文字を、すべての数値は、すべての句読点や記号が含まれています。
非印字文字の文字の3.2の意味
\ Cxはで指定された制御文字xを一致。。。それ以外の場合は、リテラル'c'は文字としては。
\ Fマッチフォームフィード文字。に相当する\とx0c \ cLと。
。に相当する\ x0Aおよび\ cJと。
\ Rは、キャリッジリターンと一致する。。
\ Sは空白、タブ、改ページなどを含む、任意の空白文字にマッチ。に相当する[\ fをする\ n \ rを\トン\ v]の。
\のSマッチ以外の任意の空白文字。。
。に相当する\ x09および\ CIの。
\ Vの垂直タブにマッチ。に相当する\ x0bと\ ckの。

いわゆる特殊文字は、単に手段として、"*. txt"を*には、上に述べた、いくつかの文字が特別な意味を持っていることをされていることを任意の文字列の意味。あなたは*を持つファイルをファイル名を検索する場合は、その前に、されていることを、エスケープする*する必要があります\。ls \*.txt。。
特殊文字が
$にマッチする文字列の末尾。あなたは、RegExpオブジェクトのMultilineプロパティを、$もマッチする'\ n'または'\ r'が設定されている場合。。
。サブ式は将来使用するために得ることができる。これらの文字を一致させるには、使用する\(と\)。
*にマッチする前に部分式と0回以上の繰り返し。。
+にマッチする前に部分一回以上。+文字を一致させるには、使用\ +。
。一致させるには、使用して\。
[マーク角かっこ表現の先頭に。[、使用を一致させるには\ [。
。。
\は、次の文字または特殊文字、または文字の本来の意味、または後方参照、または8進エスケープとしてマークされます。たとえば、'n'は文字'n'を一致。'\ n'を改行。。
^マッチは文字列の先頭に、角かっこ内の式を使用する場合を除き、それはその文字セットを受け付けない。^文字自体を使用する\ ^一致させるには。
。{一致させるには、使用\ {。
| 2つの間に指定の選択。一致させるには|を使用\ |。
。。正規表現のコンポーネントは、単一の文字、文字セット、文字範囲、文字の間で選択、またはすべてのこれらのコンポーネントの任意の組み合わせを使用できます。
3.4予選
修飾子はマッチを満たすために存在していなければならないコンポーネントの指定された数のための正規表現を指定するために使用。。
*、+と?彼らは可能な限りテキストを一致しているため、修飾子は、それらだけの背後にある、すべての貪欲ですか?非欲張りまたは最小限のマッチングを達成することができません。。
正規表現修飾子は:

*にマッチする前に部分式と0回以上の繰り返し。たとえば、zoを*は"z"と"動物園"に一致する。*と等価{0、}。
。。+は{1、}と等価である。
?一致する前の部分がゼロまたは1つ。たとえば、"(es)のか?"一致させるにはや"do""しない"の"ない"。。
nが負でない整数です。N回を決定するマッチング。。
{n、}はnが負でない整数です。マッチ少なくともn回。たとえば、'oは{2、}'o'の内の"Bob"に一致するわけではありませんが、一致することができるすべてのo"をfoooood"。。。
{n、m}はm、nは非負の整数であり、ここで、nの未満=メートル。試合は少なくともn回m回、最大で一致するように。たとえば、"o {1,3}"は最初の3つのoの"fooooood"に一致する。。なお、2つの数値のカンマとスペース。
3.5ロケータ
。Locatorは、修飾子を使用することはできません。
3.6選択
分離|括弧は、選択したすべてのアイテムは、隣接する使用の間の選択項目を囲みます。。

基準3.7以降
正規表現パターンの一部またはパターンの両側に一時的なバッファのストアに括弧を追加するに関連する試合につながるため、正規表現パターンでキャプチャされた子供たちのそれぞれのマッチングが適切なコンテンツストレージに左から発生。連続して99のサブ式の最大数まで1からストレージサブマッチングバッファ番号、。。
あなたは非捕捉メタ文字'?:','?=',または使用することができます'?!関連するマッチの保存を無視する。