如何使用 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#将具有随机空格的字符串拆分为字符串数组[关闭]

设置对象数组中每个项目的属性(C#,Regex.Split())

C#:如何将多个字符串拆分为二维数组?

SQL Regex - 选择“/”之后的所有内容并拆分为数组

如何将宽度和高度大小与 Regex 表达式匹配并在 SQL 或 C# 中使用 Sort By 来构建下拉列表?