2016-09-01 15 views
0

私は新しいC#プログラマです。私は、彼らがこの形式である場合は、PDFファイル(ブック)からヘッダを抽出する単純なC#アプリケーションを作成しようとしている:マルチラインヘッダの正規表現C#

1.1電気/電子工業は

1.2小史

string pattern = @"(\d+)(\.)(\d+) ([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+)"; 
Regex.match(strText,pattern); 
:測定

1.3単位は

は、私は、コードを使用しています

単一行ヘッダーでは問題ありませんが、2行/複数行ヘッダーでは機能しません。 誰も助けてもらえますか?

+0

目次から何か話していますか?ブックのテキスト全体を1つの文字列と見なして一度正規表現を実行すると、正規表現は決して動作しません。あなたは多くの偽陽性を拾い、おそらくいくつかを逃してしまうでしょう。 – SledgeHammer

+0

その正規表現はあなたが思っていることをしていません。例えば、 'XYZ1.2 A BRIEF HISTORY'という行と一致し、' 2.4 SUMMARY'と一致しません。正規表現についてのチュートリアルをいくつか見つけることをお勧めします(しかし**はトピックから明示的に除外されているため、ここでは**を求めていません)。 – AdrianHHH

+0

ええ、私は本の全文について話しています。私はそれが整形されているので、それを選ぶ。うまくいくと思うけど、はい、私は解決できると思う小さな問題がある@SledgeHammer – rabinmallick

答えて

0

私はC#スタイルの正規表現に慣れていませんが、.(改行を除く)の任意の文字に一致していませんか?

新しい行が必要な場合は、末尾に実際に\n を含める必要があります。おそらく?も同様です

しかし、本の書式が完璧にならない限り、この正規表現は何の問題も引き起こさないと私は驚いています。

0

すでに必要な目次が1つの文字列で取得されており、唯一の問題は2番目のレベルのヘッダーを解析することだとします。

大文字のみを照合するための正規表現が変更されました。

次のコードを使用して、必要な結果を達成することができます

string pattern = @"((\d+\.\d+) ([A-Z\s]+)\n)+"; 
    var match = Regex.Match(input, pattern); 

    var headers = new List<string>(); 
    for (var i = 0; i < match.Groups[1].Captures.Count; i++) 
    { 
     headers.Add(match.Groups[1].Captures[i].Value); 
    } 

そして、それheadersが必要なすべてのデータが含まれています後に。

inputに入力データが含まれているとします。また、\nは改行文字です。

正規表現が簡略化されました。

(\d+\.\d+)は、「1つ以上の数字」、ドット、「1つ以上の数字」、スペースのシーケンスを表します。

([A-Z\s]+)\n - 「は、一つ以上の大文字またはスペース」、「改行文字」も

は、C#の正規表現に慣れるために、次のarticleお読みください。

+0

こんにちは、リンク&ソリューションのおかげで。あなたのソリューションは、大文字と小文字の両方の文字列をキャッチします。大文字のみをキャッチする方法はありますか? – rabinmallick

+0

@rabinmallick私はキャプションの文字とスペースだけを照合するための答えで正規表現を変更しました –