我最近一直在學習正則表達式。我試圖將FDF對象收集到單個字符串中,然後我可以解析它們。我遇到的問題是我的代碼只匹配第一次出現,並且忽略FDF文件中的所有其他「對象」。c#正則表達式不匹配多次
對象以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);
(I用$在正則表達式串的結尾,但匹配0次,而使用(= \ R)匹配一次?)
編輯:有些線返回爲CR/LF,有些只是CR。我不知道文件的不同部分是否始終一致,因此我只是檢查它們。我已經解決了以下問題,至今似乎完美地工作(並且我沒有使用Multiline選項)。在你的模式添加背後的外觀是什麼在這裏所作的最大的區別....
... = 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
然後提供確切的輸入字符串和準確的期望輸出。 –