正規表現のために、私は多くの人が知っていると信じていますが、人々の第一印象の多くは、学ぶことは困難であり、一見、何のルールが見つからないことを、彼らは特殊記号の様々なすべての集まりです、完全なので、不可解。
実際には、ちょうどあなたが、元のようにああ正準相関文字、あまり使用されていないがあります理解するためにご理解の定期的な不足、それは覚えてすることは困難ではなく、理解することは困難ではないではない、唯一の難点は、読みやすさ、後に組み合わせることです理解しやすい比較的悪いではなく、この記事では、誰もが、簡単な正規表現を書くために、毎日のニーズがで開発することができ会いに来て、単純な正規表現を理解することができ、通常の基本的な理解を持つことができるようにすることを目指して。
0 \ D {2} - \ dの{8} | {3} 0 \ D - {7}あなたが肯定的に理解していない場合は、正規の期間に先立って、この文字列を全く知らないではありません、これは何を意味している\ dの?記事が詳細に各文字の意味を説明します関係ありません。
1.1正規表現とは何ですか
正規表現は、文字列パターンの特別な種類、金型で作られた製品のように、文字列のセットに一致するようにしており、金型が一致する文字の規則に準拠するために、ルールを定義し、規則的です。
1.2一般的な定期的なマッチングツール
オンラインマッチングツール:
1 http://www.regexpal.com/
2 http://rubular.com/
定期的なマッチングソフトウェア
いくつかはまだこれが最善の使用であると考え、サポートは、また、あなたは脱出を助けるなどのJava、C#のJSとして対応する正規言語などにつながるラインで直接コピーします使用した後に説明するために、正規表現をサポートするだけでなく、非常に便利ですセグメントが一緒に幸せ短いと、等、貪欲マッチングされたパケットをキャプチャするように、その部分は、です。
簡潔で2つの正規の文字
2.1元の文字を導入
「^」 ^時々文書全体の開始位置に一致する、行または列の開始位置に一致します。
「$」 :$は、行または列の末尾にマッチします
フィギュア
そして、文字はなく、他の文字とスペースなし、正規表現を終了する必要があり、これはスペースの始まりは動作しないで一致しなければなりません
「\ bは」 定期的に「\ビス\ B」に書き込まれます、私は、個々の単語にマッチする文字列「これは正規表現である」からだと思うと、任意の文字は、多くの場合、単語の境界を一致させるために使用される唯一の位置を、一致して消費しない「さ」:
\ Bは、キャラクターが両側にある一致していないが、それは言葉は国境の両側にあるかどうかを識別します
"\ dの":マッチング番号、
たとえば、など04 7ビットを、開始する前に、固定フォーマットで電話番号と一致するように、通常の0737から5686123:ここで^ 0 \ D \ D \ D- \ D \ D \ D \ D \ D \ D \ D $ただ「\ dの」文字を導入し、実際にはより良い文言を以下に説明します。
"\ W" :一致する文字、数字、アンダースコア。
「\ wの+」数量詞に「+」の文字が繰り返しの数を指し、詳細は後に以下となります。例えば、私が定期的に「a2345BCD__TTz」と一致します。
「\ Sは」:スペースと一致しました
例えば、文字は「AB cは、」正規:スペース、直接複数の空間「\ s」の場合間書かれた文字に続く文字「W \ S \ W \ S \ W \」は「\ sの+」リピートスペースをしてみましょう
。「」:改行以外の任意の文字と一致
これは、「W \」とスペースが制限されます場合は空白の文字列に一致する、として見ていない「\ W」の強化版「W \」とみなさ「」文字「A23 4 5 BC D__TTzを一致させる方法です"定期的に:" + "。
「[ABC]」:括弧文字に含まれる一致する要素の文字セット
これが唯一のメモリの括弧内の文字のように書くこともでき一致比較的簡単である[AZ]だから英語のみで入力を制御するために使用することがZに等しい文字に一致します、
2.2いくつかのアンチセンス
ライン上の資本の文言を変更することは非常に簡単で、反対の本来の意味で、子供の例がありません
「\ Wは、」 任意のない文字、数字、アンダースコア文字にマッチします
「\ Sが」 一致した任意の文字は空白ではありません
「\ Dは」 任意の数字以外の文字にマッチします
「\ Bは」 言葉が最初や最後の位置ではありません一致します
"[^ abc]は" ABC以外の任意の文字に一致し
2.3数量詞
最初の関与3つの数量に関する重要な概念を説明
そのようなあなたはそれを選択したとして多くのコンテンツにマッチしようとすると、「*」の文字貪欲数量詞は、最初の文字列全体にマッチしますし、それが失敗した場合は、再度1つの文字を移動し、プロセスをバックトラッキングと呼ばれるロールバックに再度お試しとしてグリード(強欲)、あなたが一致するか何も文字がロールバックすることはできないコンテンツを見つけるまでには、1つの文字ごとに移動します。資源の消費、以下の貪欲数量詞の比較すると2種類が最大で、
レイジー(やっと)、など、「?」レイジーターゲットの位置を一致させるための試みの先頭から開始数量詞別の方法が一致し、毎回文字チェック、および、それに合わせて、コンテンツを探しているとして、その文字までのサイクルの終わりに。
例えば、「+」数量詞の所持などの所持は、物事にターゲット文字列をカバーして、一致するものを見つけようと、一度だけしてみてください、戻って最初のような石の一握りをつかむ、そして岩から金を取り出すませんでしょう
「*」(貪欲)は 0回以上の繰り返し
すべての通常のマッチング例えば「AAAAAAAA」の文字列:「*」は、すべての文字の外になります「」
「+」(レイジー) 1回以上繰り返します
たとえば、一致する「AAAAAAAA」の文字列のすべての定期的な:ということは、「+」は、少なくとも1つ、「*」であってもよい0回であることを除い「A +」、「+」と「*」のすべての文字の文字を取得します、
「?」の文字の組み合わせは、後でこの区別を反映するようになります
「?」(所持) ゼロまたは1回の繰り返し
それは単一の文字だけの結果であり、一度だけマッチ「A?」:たとえば、通常の「AAAAAAAAは、」文字列にマッチします
"{n}は" n回繰り返されます
例えば、「AAAAAAAA」の文字列から正規繰り返し三回に一致する:「{3}」結果は3つの文字「AAA」と解釈されます。
"{N、M}は、" mまでN回繰り返します
マッチングのための文字は三つの「AAA」となるように例えば、定期的な「{3,4}は」4つの「AAAA」であってもよい繰り返し三回または4回にマッチする正規に合わせることができます
「{N}」 繰り返しn回以上
そして{N、M}マッチの数は異なるが上限がないことであるが、正規倍N少なくとも「{3}」は、少なくとも3回反復します
数量詞の後に電話番号が通常の理解試合は今、あまりにも単純なポイント^ 0 \ D \ D \ D- \ D \ D \ D \ D \ D \ D \ D $は^ 0 \」に変更することができます変更することができます前に、 D + - \ dは{7} $」。
このような書き込みは、あなたがそれらの多くを入力できるように、定義された市外局番の前で行われていない場合ので、完璧ではないが、通常は3または4
今、それを変更する「^ 0 \ D {2,3} - \ dの{7}」このようにエリアコード部分が3つのうち4つを一致します
2.4怠惰な修飾子
「*?」 何回でも繰り返すが、あまり重複可能な限り
このような「acbacb」通常の「*?Bは、」最小文字数「acbacb」最初「ACB」すべてが、修飾子を追加するために取られた可能性があり、いくつかの文字のみと一致し、になりますように結果は「ACB」であります
「+?」 1回以上繰り返すが、あまり重複可能な限り
上記のように、少なくとも1時間を除いて繰り返します
「??」は 可能な限り0または1を繰り返したが、あまり重複
このような「aaacb」通常の「a.??b」として最後の3つの文字「ACB」になります
"{N、M}?" mとn回繰り返したが、以下のように繰り返します
「AAAAAAAA」カノニカル「{0、M}」結果を得るために起こったので、0回であるがnullであります
「{N}?」 できるだけn回以上繰り返し、あまり複製
「」結果を取るように「AAAAAAA」カノニカル「{1}」少なくとも1倍です
三つの定期的な前売
パケットキャプチャ3.1
実際には、そのような「(\ d)の\ dの」と「(\ D)」など括弧内のコンテンツは、これは、キャプチャグループがあり、ポジティブにグループ分けの概念に捕獲されて理解するには、(参考にパケットをキャプチャするために投稿することができた後であればしかし(\ D)\ D \のように)以前に定義されたものと同じコンテンツの表現を簡単にするために、直接捕捉基に参照することができる持っているの「(\ D)」への参照である「\」1
それは知っている例を参照することが何であるかを使用することをパケットキャプチャ
このような "zeryのzery"(+ W \)、通常の\ bの\として\ Bので、ここでは "\ 1" はグループ名が多い可能にするために、 "zery" と文字だけでなく、(\ + W)とを撮影しています.B \ \ 1秒あなたがグループ名をカスタマイズすることができ、意味するの名前です。
"\ B(?<名> \ + W)\ bの\ S \ K <名> \ B" "?<名前>" あなたはしばらく前に書かれた覚えておく時間基準グループにグループ名をカスタマイズすることができます「\ K <名>「、カスタマイズグループ名、値を捕捉するグループマッチングは、で定義されたグループ名に格納されます
以下に列挙キャプチャ一般的な使用をグループ化されています
「(EXP)」 試合の経験、および自動的にグループの名前にテキストをキャプチャ
「(?<名前> EXP) 」 試合の経験、およびグループの名前を命名するテキストをキャプチャ
:「(?EXP)」 テキストマッチの経験、試合をキャプチャしていない、パケットは、このグループ番号に割り当てられていません
以下のゼロ幅アサーション
"(?= EXP)" EXPの前のマッチング位置
このような「どのようにあなたがやっている」として、通常の「(?<txtが>。+(?=のIng))」ここINGの前のすべての文字を取って、「TXT」や「TXT」このグループの名前のキャプチャグループを定義するには「あなたがある方法」です。
"(?<= EXP)" EXPの背後に位置を合わせます
このような「方法」の後に文字のこのすべてを取り、「TXT」や「TXT」この名前のキャプチャグループを定義する「(?<txtが>(?<=どのように)。+)」通常の「どのようにあなたがやっている」として、グループの値は、「あなたがやっています」。
「(?!EXP)は、」 関数expされていないバックの位置と一致して
"123ABC" 通常の "\ dは{3}(?!\ D)" デジタル試合後3つの非数値結果
"(?<!EXP)" のexpよりも前の位置に合わせて
"ABC123" 通常の "(?<![0-9])123" マッチ "123" は、前の図の結果はまた、非書き込むことができます "(?!<\ D)123"
4つの通常戦闘
定期的にフィルタを行うことの検証を実施し、データは素晴らしいかもしれないが、私はここに私達はちょうどすべての定期的なフィルターのHTMLタグと実際のやってデータ収集を行い、対応するデータを取るために組み合わせることを知って、使用済みの友人のすべてを知っていると思います
戦場公園での選挙で私たちのブログ。仮定今、すべての情報を収集することをブログの記事ホームパーク記事のタイトルが含まれ、作者のブログは、連絡先をリンクし、はじめに公開された記事では、データ、コメント、勧告の番号を読み取ります。
ガーデンのブログ記事のHTML形式を見てください
<DIV CLASS = "post_item"> <DIV CLASS = "ディグ"> <DIV CLASS = "diggit"のonclick = "DiggIt(3439076,120879,1)"> <スパンクラス= "diggnum" ID = "digg_count_3439076"> 4 </スパン> </ div> <DIV CLASS = "クリア"> </ div> <DIV ID = "digg_tip_3439076"クラス= "digg_tip"> </ div> </ div> <DIV CLASS = "post_item_body"> < H3> <a class="titlelnk" href="http://www.cnblogs.com/swq6413/p/3439076.html" target="_blank">分享完整的项目工程目录结构する</a> </ H3 > <Pクラス= "post_item_summary"> <a href="http://www.cnblogs.com/swq6413/" target="_blank"> <IMG幅= " 48"高さ= "48"クラス= "PFS" SRC =「のhttp:// PIC。 「ALT =」「/> cnitblog.com/face/142964/20131116170946.png </a>のディレクトリを管理しやすい明確な分類を確立するため、プロジェクトを保存するために、プロジェクトの開発過程で、データファイルのどのように様々な種類を、構造は非常に重要です。前のプロジェクトと何人かの友人との包括的なプロジェクト構造は、私はかなり良いプロジェクトのディレクトリ構造をまとめると思います。ここではあなたに共有するために、前方にあなたの貴重な意見やご提案を置くことを歓迎します。あなたが好きなら、してください「勧告」は、感謝です!!サブディレクトリレベル4にディレクトリ全体、本当... </ p型> の<divクラス= "post_item_foot"> <a href="http://www.cnblogs.com/swq6413/" class="lightblue"> 7マスター</a>の 投稿2013年11月23日午後03時48分 <スパンクラス= "article_comment"> <HREF = "http://www.cnblogs.com/swq6413/p/3439076.html#commentform"タイトル= " コメント(4)</a>の</ span>の <スパンクラス= "article_view"> <HREF =「http://www.cnblogs.com/ swq6413 / P / 3439076.html "
そして、データをピックアップし、ろ紙のHTMLタグが定期的に強い力が発揮されとるとき、HTTPリクエストの鍵情報を構成することによって得られたデータを処理するには
基本的な知識の正則化はまた、として過ごす「\ S \ワット+。*?」そうであり、パケットキャプチャ、ゼロ幅アサーション、および。友人はそれを試してみたい、そして正と定期的なコードを対応するデータは、単純な、非常に基本的であり、その意味や用法が上に詳細に書かれているかを確認するために自分自身を取ります。
クラスプログラム { 静的な無効メイン(文字列[] args) { 文字列の内容= HttpUtility.HttpGetHtml()。 HttpUtility.GetArticles(コンテンツ)。 } } 内部クラスHttpUtility { //默认获取第一页数据 パブリック静的文字列HttpGetHtml() { HttpWebRequestの要求=(HttpWebRequestの)WebRequest.Create( "http://www.cnblogs.com/")。 request.Accept = "text / plainで、* / *; Q = 0.01"; request.Method = "GET"。 request.Headers.Add( "言語を受け入れる" "ZH-CNを、ZH; EN-US Q = 0.8、; Q = 0.5、EN; Q = 0.3")。 要求。 request.Host = "www.cnblogs.com"。 request.UserAgent = "Mozillaの/ 5.0(Windows NTの6.1)のAppleWebKit / 537.1(KHTMLは、ヤモリなど)のMaxthon / 4.1.3.5000クローム/ 26.0.1410.43サファリ/ 537.1"; HttpWebResponseの応答=(HttpWebResponseの)request.GetResponse(); ストリームresponStream = response.GetResponseStream()。 StreamReaderをリーダー=新しいStreamReaderを(responStream、Encoding.UTF8)。 ストリング含有量= reader.ReadToEnd()。 コンテンツを返します。 } パブリック静的リスト<論文> GetArticles(文字列htmlString) { リスト<論文> articleList =新しいリスト<論文>(); 正規表現正規表現= NULL; 記事の記事= NULL; 正規表現=新しい正規表現( "<divのクラス= \" post_itemの\ ">(?<内容>。*?)(?= <divのクラス= \"クリア\ ">" + @ "</ div>の\ sの* < / DIV>)」、 RegexOptions.Singleline)。 IF(regex.IsMatch(htmlString)) { MatchCollection aritcles = regex.Matches(htmlString)。 foreachの(aritclesでマッチ項目) { 品=新品(); //取推荐 正規表現= 新しい正規表現( "<divのクラス= \"ディグ\ ">。* <スパン。*>(?<digNum>。 "* <DIV CLASS = \ "post_item_bodyの\">"、RegexOptions.Singleline)。 article.DiggNum = regex.Match(item.Value).Groups [ "digNum"]の値。 //取文章标题需要去除转义字符 正規表現=新しい正規表現( "<H3>(<A> *)</ H3>?。"、RegexOptions.Singleline)。 列A = regex.Match(item.Value).Groups [ ""]の値。 正規表現=新しい正規表現( "<。\\ S *のhref = \"?。?(<HREF> *)\ "?。*>(<概要> *)</a>を。"、RegexOptions.Singleline)。 article.AritcleUrl = regex.Match(A).Groups [ "HREF"]の値。 article.AritcleTitle = regex.Match(A)「[.Groups 正規表現=新しい正規表現( "<*。>(<IMG> <IMG [^>] *>)</a>の?。"、RegexOptions.Singleline)。 article.AuthorImg = regex.Match(item.Value).Groups [ "IMG"]の値。 //取作者博客URL及链接的ターゲット属性 のregex =新しい正規表現( "<\\ S *?のhref = \"(?<HREF>。*)\ "\\ sの*?ターゲット= \"(?< 。?ターゲット> *)\ "> * </a>を。"、 RegexOptions.Singleline)。 article.AuthorUrl = regex.Match(item.Value).Groups [ "HREF"]の値。 ストリングurlTarget = regex.Match(item.Value).Groups [ "ターゲット"]の値。 //取文章简介 // 1先取要約本部中所有内容 正規表現=新しい正規表現( "<Pクラス= \" post_item_summaryの\ ">(<概要> *)</ P>?。"、RegexOptions.Singleline)。 文字列要約= regex.Match(item.Value).Groups [ "要約"]の値。 简介// 2取 正規表現=新しい正規表現( "?。(<indroduct>(<= </ A>)*)"、RegexOptions.Singleline)。 article.AritcleInto = regex.Match(要約).Groups [ "indroduct"]の値。 //取发布人与发布时间 正規表現= 新しい正規表現( "<divのクラス= \" post_item_footの\ "> \\よ* <。*?>(?<publishName>。*)</a>に(?<publishTime >。*)< article.Author = regex.Match(item.Value).Groups [ "publishName"]の値。 article.PublishTime = regex.Match(item.Value).Groups [ "publishTime"] Value.Trim()。 //取评论数 のregex = 新しい正規表現( "<スパンクラス= \" article_commentの\ "> <。*>(?<コメント>。*)</a>を</ span>の<スパンクラス= \" article_view \ ">"、 RegexOptions.Singleline)。 article.CommentNum = regex.Match(item.Value).Groups [ "コメント"]の値。 //取阅读数 のregex =新しい正規表現( "<スパン\\ S *クラス= \" article.ReadNum = regex.Match(item.Value).Groups [ "readNum"]の値。 articleList.Add(記事)。 } } 戻りarticleList。 } パブリック静的文字列ClearSpecialTag(列htmlString) { ストリングhtmlStr = Regex.Replace(htmlString、 "\ n"、 ""、RegexOptions.IgnoreCase)。 htmlStr = Regex.Replace(htmlStr、 "\ tの"、 ""、RegexOptions.IgnoreCase)。 htmlStr = Regex.Replace(htmlStr、 "\ R"、 ""、RegexOptions.IgnoreCase)。 htmlStr = Regex.Replace(htmlStr、 "\"」、 "'"、RegexOptions.IgnoreCase)。 htmlStrを返します。 } } 公共の文字列AuthorUrl {取得します。セット; } /// <まとめ> ///著者ピクチャー /// </要約> パブリック文字列AuthorImg {取得または設定;} /// <まとめ> ///公開 /// </要約> パブリック文字列PublishTime {GET ; SET;} /// <まとめ> ///推奨数 /// </要約> パブリック文字列DiggNum {取得または設定;} /// <まとめ> ///コメント /// </要約> 公衆CommentNum {文字列を取得し、SET;} /// <まとめ> ///数読み取る /// </要約> パブリック文字列ReadNum {取得または設定;} }
定期書かれた部分は、彼は定期的に新しいもので、他のため、この比較は単純な定期的に書くことができ、完璧であってもよいが、少なくともそれと一致しない場合があります。また、あなたが許しを願って~~
ファイブ概要
定期的に自分の手がすぐに自然に理解し、いくつかの書き込みしようとした後、各記号の意味を理解することは困難ではない、正則は、単にデータと一致する点より少し書き悪名高いピットとよりです私は刻印の経験を踏んステッピング、ピットの多くを踏ん。
この記事では、通常は、多くの通常の文字には導入が存在しない、非常に基本的な導入をしただけで、より一般的に使用されるのいくつかを書くだけのためです。間違っている場合は、だけでなく、コメントでお願いいたします私はすぐに変更されることを指摘しています。