我最近一直在学习正则表达式。我正在尝试将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);
答案 0 :(得分:0)
模式中的^
只会在字符串的开头匹配。请改为\b
。
答案 1 :(得分:0)
MSDN Regex Web help似乎在说^
匹配的内容:
^
- 匹配搜索字符串开头的位置。如果标记中包含m
(多行搜索)字符,则^
也会与\n
或\r
后面的位置匹配。
它只匹配 \n
之后的位置,请following demo与@"(?m)^\d+"
模式匹配1
,2
, 4
输入中的"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。