c#regex没有';t匹配多次

本文关键字:没有 c#regex | 更新日期: 2023-09-27 18:08:15

我最近一直在学习正则表达式。我正在尝试将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。我不知道文件的不同部分是否总是一致的,所以我只检查所有的行。我已经确定了以下内容,到目前为止,它似乎运行得很好(并且我没有使用多行选项(。在背后添加外观是这里最大的区别。。。。

... = 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);

c#regex没有';t匹配多次

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

MSDN Regex Web帮助似乎在^匹配的内容上撒谎:

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

它只匹配'n之后的位置,请参阅以下演示,其中@"(?m)^'d+"模式匹配"1'r'n2'r3'n4"输入中的124(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#演示。