4

令我惊讶的是,我无法找到一个答案或示例,说明使用正则表达式解析文本应该是一个相当常见的问题。我正在使用本机 C# 正则表达式;不是第三方组件。

这是嵌套列表的问题;例如,假设我有一个具有已定义格式的文本文件,但我想在一个类中构造它(下面的假设示例):

Input Text
Name: Joe Smith
Occupation: Software Developer
Patent(s) Awarded: 3 award(s)
                   Light Bulb
                   Rollercoasters
                   NTFS

所需的输出是一个匹配,具有如下内容:

MatchCollection.Groups["Name"].Value
MatchCollection.Groups["Occupation"].Value
MatchCollection.Groups["AwardCount"].Value

... and then some form of list for the individual patents...
e.g. MatchCollection.Groups["Award"][0].Value
e.g. MatchCollection.Groups["Award"][1].Value
e.g. MatchCollection.Groups["Award"][2].Value
          ... and so on ...

现在要做的是第一次获取所有非列表信息并将专利列表视为单个字符串;例如:

Name:\s+(?<Name>.+)\nOccupation:\s+(?<Occupation>.+)\nPatent\(s\) Awarded:\s+(?<AwardCount>\d+).*\n(?<AwardInfo>(?:.*\r\n)*)

...然后对专利列表进行二次传递以创建可枚举的专利字符串列表。如果有下面的构造告诉正则表达式您希望这个子表达式项在它发生时被拾取,那就太好了:

(?<AwardInfo>(?:.*\r\n)*)*
                         ^
                         Which would return a second list to the Match object.

我是否忽略了一些简单的输出,使我能够迭代各个专利?如果没有,是否有人仅使用一个正则表达式创造性地解决了这个问题?

4

1 回答 1

4

如果您设置正则表达式以<AwardInfo>分别匹配每一行 - 通过移动*组外部(并修剪空白,并使换行符可选):

(?:\s*(?<AwardInfo>.*(?:\r\n)?))*

然后您可以使用该Captures组上的属性来获取该组匹配的每个不同值。例如,

MatchCollection[0].Groups["AwardInfo"].Captures[0] is "Light Bulb"
MatchCollection[0].Groups["AwardInfo"].Captures[1] is "Rollercoasters"
MatchCollection[0].Groups["AwardInfo"].Captures[2] is "NTFS"
于 2013-01-10T14:20:31.397 回答