Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正则表达式将作者拆分为对象或数组C#?_C#_Regex_String_Split - Fatal编程技术网

如何使用正则表达式将作者拆分为对象或数组C#?

如何使用正则表达式将作者拆分为对象或数组C#?,c#,regex,string,split,C#,Regex,String,Split,我正在开发一个软件,该软件读取.txt文件内容并将该内容写入ms word的Sources.xml 我想将文本拆分为对象或数组(无所谓) 关键是,如果句子的一部分包含一个(或多个)大写字母和一个点(.),那么它就是作者。如果句子包含多个作者,则事先用逗号分隔 示例输入 W.M.p.van der Aalst K.van Hee,《工作流管理:模型、方法和系统》(麻省理工学院出版社,剑桥,2004) A.Shtub,R.Karni,ERP:供应链和过程管理的动态(柏林斯普林格,2010) 第一个输

我正在开发一个软件,该软件读取.txt文件内容并将该内容写入ms word的Sources.xml

我想将文本拆分为对象或数组(无所谓)

关键是,如果句子的一部分包含一个(或多个)大写字母和一个点(.),那么它就是作者。如果句子包含多个作者,则事先用逗号分隔

示例输入

W.M.p.van der Aalst K.van Hee,《工作流管理:模型、方法和系统》(麻省理工学院出版社,剑桥,2004)

A.Shtub,R.Karni,ERP:供应链和过程管理的动态(柏林斯普林格,2010)

第一个输入的输出应该是这样的:W.M.p.van der Aalst K.van Hee

Secons Input的输出应该是这样的:A.Shtub和R.Karni(它们可以是数组或对象,这没关系,但我必须逐个处理它们)

示例代码

参考文献[0]=“A.Shtub,R.Karni,ERP:供应链和过程管理的动态(柏林斯普林格,2010)”
var a=Regex.Split(引用[0],@“([a-Z][.])*\s\w*[,]”).ToList();
//输出应如下所示:
//a[0]=a.Shtub

//a[1]=R.Karni
您始终可以使用逗号分割整个字符串,以便于使用:

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个或更多字母的字符。

广泛匹配可能是匹配大写字符后跟数字,并使用与除逗号以外的任何字符匹配的否定字符类

\b[A-Z]\.[^,]+
\b(?:[A-Z]\.)+(?: \w+\.?)* \w+(?=,)

更具体一点的模式可能是匹配1+倍的大写字符,后跟逗号,然后使用重复组匹配空格,后跟wordhcharacters和可选点。最后,使用积极的前瞻性断言逗号

\b[A-Z]\.[^,]+
\b(?:[A-Z]\.)+(?: \w+\.?)* \w+(?=,)
|

比如说

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

有一个问题。作者名只包含一个大写字母和一个点。例如:“A.Shtub”或“W.M.P.van der Aalst K.van Hee”是作者,但“第二版”不是作者。@EdizNezir你说得对,添加了一个子句以排除任何数字字符。实际上,数字字符是不够的。例如,“edn.”对我来说仍然是个问题。查询必须采用“A.B.C.”或“A.”格式,而不是“ABC.”或“ABC.”一个字母和一个点。@EdizNezir我误解了,抱歉,进行了另一次编辑,希望这就是您要查找的内容