私は最近正規表現について学んでいます。私は個々の文字列にFDFオブジェクトを集めようとしています。それを解析することができます。私が抱えている問題は、私のコードが最初のオカレンスと一致するだけで、FDFファイルの他のすべての "オブジェクト"は無視されるということです。#regexが複数回一致しない
オブジェクトは2つの数字と文字列 "obj"で始まり、改行(改行ではない)で始まります。それらはキャリッジリターンと文字列 "endobj"の後で終了します。
//testing parsing into objects...
List<String> FDFobjects = new List<String>();
String strRegex = @"^(?<obj>\d+ \d+) obj\r(?<objData>.+?)\rendobj(?=\r)";
Regex useRegex = new Regex(strRegex, RegexOptions.Multiline | RegexOptions.Singleline);
StreamReader reader = new StreamReader(FileName);
String fdfString = reader.ReadToEnd();
reader.Close();
foreach (Match useMatch in useRegex.Matches(fdfString))
FDFobjects.Add(useMatch.Groups["objData"].Value);
if (FDFobjects.Count > 0)
Console.WriteLine(FDFobjects[0]);
Console.WriteLine(FDFobjects.Count);
(、私は正規表現文字列の末尾に$を使用していたが、それは0回にマッチし、一度(= \ r)が一致して使用し、一方、?。)
編集を:いくつかの改行がCR /ありますLF、一部はCRです。私はそれがファイルのさまざまな部分に対して常に一貫しているかどうかはわかりません。だから、私はそれらのすべてをチェックします。私はこれまで完璧に動作していると思われる以下を解決しました(そして私は複数行オプションを使用していません)。後ろの外観を追加すると、ここでの最大の違いを作ったものです....あなたのパターンで
... = new Regex(@"(?<=^|[^\\](\r\n|\r|\n))(?<objName>\d+ \d+) obj(\r\n|\r|\n)(?<objData>.*?)(?<!\\)(\r\n|\r|\n)endobj(?=\r\n|\r|\n|$)", RegexOptions.Singleline);
"@(? \ d + \ d +)obj \ r?\ n(?。+?)\ r?\ nendobj(?= \ r?\ n)" 'を試してください。おそらく '\ r'をより柔軟な' \ r?\ n'に変更すると助けになるでしょう。正確なサンプル文字列がなければ、このパターンを手助けするのは容易ではありません。 –
@Wiktor:ありがとう。それは動作しません。 FDFはキャリッジリターンのみを使用しています。 – someprogrammer
次に正確な入力文字列を正確な出力を提供します。 –