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
我正在使用 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