C# 正则表达式解析或名称

C# Regex Parsing Or Names

我正在使用 iTextSharp 从可打印的 PDF 中提取数据。这是我提取的文本:

Borrower: Guarantor:
{{0_SH}} By: {{1_SH}} (seal)
By: (seal)
Print Name:
Print Name:
Phillip Moore Phillip Moore
Date: {{1_DH}}
2/23/2022
Title: Owner
Date: {{0_DH}}
2/23/2022
12 of 12 (LOC 2020) Borrower Initials {{0_IH}}

我写了这个正则表达式例程:

string pattern = @"Print\sName:\s(?'guarantor1'[a-zA-Z|\s|-|-|'|,|.|&|\d]+)\n";
Regex rgx = new Regex(pattern, RegexOptions.Singleline);
MatchCollection matches = rgx.Matches(fullText);
if (matches.Count > 0)
{
    string guarantor1 = matches[0].Groups["guarantor1"].Value;
    return guarantor1.Trim();
}

但是从 guarantor1 的正则表达式中提取的数据是 Phillip Moore Phillip Moore。我只需要菲利普摩尔的第一部分。任何想法如何正确解析这个?也可以有中间名或首字母。

您可以匹配最后一次出现的 Print Name:,然后尽可能少地匹配允许的字符,直到您使用反向引用直到字符串末尾遇到相同的字符。

注意 \s 也可以匹配换行符。

\bPrint\sName:\n(?!Print\sName)(?'guarantor1'[a-zA-Z\s',.&\d\--]+?)(?= $)

看到一个regex demo and a C# demo.

如果还应该有一个没有双重命名的匹配项,space 和对第 1 组的反向引用可以是可选的。

\bPrint\sName:\n(?!Print\sName)(?'guarantor1'[a-zA-Z\s',.&\d\--]+?)(?=(?:\s)?$)

再看一个Regex demo

示例代码

string pattern = @"\bPrint\sName:\r?\n(?!Print\sName)(?'guarantor1'[a-zA-Z\s',.&\d\--]+?)(?= \r?$)";
Regex rgx = new Regex(pattern, RegexOptions.Multiline);
MatchCollection matches = rgx.Matches(fullText);
if (matches.Count > 0)
{
    string guarantor1 = matches[0].Groups["guarantor1"].Value;
    Console.WriteLine(guarantor1.Trim());
}

输出

Phillip Moore