如何使用 REGEX 将作者拆分为对象或数组 C#?
Posted
技术标签:
【中文标题】如何使用 REGEX 将作者拆分为对象或数组 C#?【英文标题】:How To Split Authors with REGEX to object or array C#? 【发布时间】:2020-01-14 18:46:38 【问题描述】:我正在开发一个软件,它可以读取 .txt 文件内容并将该内容写入 ms word 的 Sources.xml。
我想将文本拆分为对象或数组(没关系)。
关键是,如果句子的一部分包含一个(或多个)大写字母和一个点 (.),那么它就是作者。如果句子包含多个作者,则预先用逗号分隔。
示例输入
W.M.P. van der Aalst K. Van Hee,工作流管理:模型、方法和系统(麻省理工学院出版社,剑桥,2004 年) A. Shtub、R. Karni,ERP:供应链和流程管理的动态(Springer,柏林,2010 年)
第一个输入的输出应该是这样的: W.M.P. van der Aalst K. Van Hee Secons Input 的输出应该是这样的: A. Shtub 和 R. Karni (它们可以是数组或对象没关系,但我必须使用它们一个一个)
示例代码
references[0] = "A. Shtub, R. Karni, ERP: The Dynamics of Supply Chain and Process Management (Springer,Berlin, 2010)"
var a = Regex.Split(references[0], @"([A-Z][.])*\s\w*[,]").ToList();
//Output should be like:
// a[0] = A. Shtub
// a[1] = R. Karni
【问题讨论】:
【参考方案1】:您总是可以用逗号分隔整个字符串,以便于使用:
var a = (from words in references[1].Split(',')
where !words.Any(ch => char.IsNumber(ch)) && Regex.IsMatch(words, "([A-Z][.])+") && !Regex.IsMatch(words, "[a-zA-Z]2,[.]")
select words.Trim()).ToList(); // .ToList() not required here if not needed
foreach (string str in a)
Console.WriteLine(str);
// references[0] output:
// W.M.P. van der Aalst K. Van Hee
// references[1] output:
// A. Shtub
// R. Karni
Regex.IsMatch(words, "([A-Z][.])+")
将确保该模式确实存在。
!Regex.IsMatch(words, "[a-zA-Z]2,[.]")
将排除点前有 2 个或更多字母的任何字符。
【讨论】:
有问题。作者姓名仅包含一个大写字母和一个点。例如:“A. Shtub”或“W.M.P. van der Aalst K. Van Hee”是作者,但“2nd. Edition”不是作者。 @EdizNezir 你是对的,添加了一个子句来排除任何数字字符。 其实数字字符是不够的。例如“edn”。对我来说仍然是个问题。查询必须采用“A.B.C.”或“A”。格式,而不是“ABC”。或“ABC”。一个字母和一个点。 @EdizNezir 我误解了抱歉,进行了另一次编辑,希望这就是您要寻找的内容【参考方案2】:广泛匹配可能是匹配一个大写字符后跟一个数字,并使用一个否定字符类匹配除逗号以外的任何字符。
\b[A-Z]\.[^,]+
Regex demo
更具体的模式可能是匹配 1 次以上的大写字符后跟逗号,然后使用重复组匹配空格后跟 wordhcharacters 和可选点。最后使用肯定的前瞻来断言逗号。
\b(?:[A-Z]\.)+(?: \w+\.?)* \w+(?=,)
Regex demo | C# demo
例如
string pattern = @"\b(?:[A-Z]\.)+(?: \w+\.?)* \w+(?=,)";
string input = @"W.M.P. van der Aalst K. Van Hee, Workflow Management: Models, Methods, and Systems (MIT Press, Cambridge, 2004)
A. Shtub, R. Karni, ERP: The Dynamics of Supply Chain and Process Management (Springer,Berlin, 2010)";
foreach (Match m in Regex.Matches(input, pattern))
Console.WriteLine(m.Value);
输出
W.M.P. van der Aalst K. Van Hee
A. Shtub
R. Karni
【讨论】:
以上是关于如何使用 REGEX 将作者拆分为对象或数组 C#?的主要内容,如果未能解决你的问题,请参考以下文章
C# Regex.Split,如何将字符串拆分为用括号括起来而不是用括号括起来?
设置对象数组中每个项目的属性(C#,Regex.Split())