【问题标题】:isolate/identify encapsulated parts of a string c# (identifying substrings)隔离/识别字符串c#的封装部分(识别子字符串)
【发布时间】:2016-07-25 09:57:14
【问题描述】:

我有一个来自自然语言的文本文件,其中填充了不同标签形式的封装数据。例如:

<Age>53 year old</Age> woman, well known since earlier. Currently under the care of
<First_Name>Sara</First_Name> <Last_Name>Storm</Last_Name> 
and dr. <First_Name>John</First_Name> <Last_Name>Beck</Last_Name>

提取所有标签及其数据的最佳方法是什么?我想要的输出是

 <Age>53 year old</Age>
 <First_Name>Sara</First_Name>
 <First_Name>John</First_Name>
 <Last_Name>Storm</Last_Name>
 <Last_Name>Beck</Last_Name>

我尝试使用循环遍历字符串来查找标记的索引。由于我想将不同的标签和封装数据添加到列表中,因此此解决方案不合适:

string findFirstName = "<First_Name>";
string findLastName = "<Last_Name>";
string endFirstName = "</First_Name>";
string endLastName = "</Last_Name>";
string findAge = "<Age>";
string endAge = "</Age>";

int startIndex;
int endIndex;
int length;
foreach (Match m in Regex.Matches(pieceContent, findFirstName))
{      
    startIndex = m.Index;
}

谢谢!

【问题讨论】:

  • 为什么不为此使用 XML 解析器?
  • @SelmanGenç - 这不是 XML。

标签: c# .net string substring


【解决方案1】:

您可以使用正则表达式反向引用来捕获标签:

var tags = Regex.Matches(input, @"<([_a-zA-Z]+)>.*<\/\1>");

第一个捕获组([_a-zA-Z]+) 将匹配标签名称(XML 名称的限制比这更多,但这是一个只允许字母和下划线的简单示例) - 并且反向引用\1 匹配结束标签到第一个捕获组。

【讨论】:

  • 我必须说,这个反向引用的东西非常酷。以前从未听说过!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多