c#regex多次匹配

时间:2016-09-21 19:59:25

标签: c# regex

我最近一直在学习正则表达式。我正在尝试将FDF对象收集到单个字符串中,然后我可以解析它。我遇到的问题是我的代码只匹配第一次出现,而忽略了FDF文件中的所有其他“对象”。

对象从它们自己的行开始,带有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。我不知道它是否始终与文件的不同部分保持一致,所以我只检查所有这些部分。我已经解决了以下问题,到目前为止似乎完美无缺(我没有使用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);

2 个答案:

答案 0 :(得分:0)

模式中的^只会在字符串的开头匹配。请改为\b

答案 1 :(得分:0)

MSDN Regex Web help似乎在说^匹配的内容:

  

^ -   匹配搜索字符串开头的位置。如果标记中包含m(多行搜索)字符,则^也会与\n\r后面的位置匹配。

它只匹配 \n之后的位置,请following demo@"(?m)^\d+"模式匹配124输入中的"1\r\n2\r3\n4" 3前面有\r)。

在开头使用(?<=\r|^),在结尾使用(?=\r|$)

var s = "1 2 obj\rObj1\rendobj\r2 3 obj\rObj2\rendobj\r3 45 obj\rObj3\rendobj";
var matches = Regex.Matches(s, @"(?<=\r|^)(?<obj>\d+ \d+) obj\r(?<objData>.+?)\rendobj(?=\r|$)",
        RegexOptions.Multiline | RegexOptions.Singleline);
foreach (Match m in matches)
{
    Console.WriteLine("___ MATCH ___");
    Console.WriteLine(m.Value);
}

输出所有3场比赛:

___ MATCH ___
1 2 obj
Obj1
endobj
___ MATCH ___
2 3 obj
Obj2
endobj
___ MATCH ___
3 45 obj
Obj3
endobj

请参阅C# demo online