仅使用正则表达式提取匹配的文本

时间:2017-09-26 23:50:52

标签: c# regex

我正在读取整个txt文件并尝试查找字符串的特定部分。例如,我正在寻找字符串“日期:2017年9月23日”。当然日期会发生变化,这不是我的问题。发生的事情是,一旦找到我的匹配,我就会得到文件的其余部分。我的问题是我怎么告诉它只是得到我想要的而不是文件的其余部分?

我的代码看起来像这样

pattern = @"Date:\s(?'date'\w.*)\s"
rgx = new Regex(pattern, RegexOptions.Singleline);
matches = rgx.Matches(fileContents);

fileContents看起来像这个片段:

Date: 23 Sep 2017 

1. In this Agreement, "I", "me" and "my" refers to the account holder. 

2 个答案:

答案 0 :(得分:1)

使用.*,您可以匹配任何长度的任何内容,因此它与整个文件匹配。

所以,你的正则表达式应该是:

Date:\s(?'date'\d*\s\w*)\s
  • \ d *匹配一个数字(等于[0-9])
  • *量词 - 在零和无限次之间匹配,尽可能多次,根据需要返回\ s匹配任何空格字符(等于[\ r \ n \ t \ f \ v])< / LI>
  • \ w *匹配任何单词字符(等于[a-zA-Z0-9 _])

答案 1 :(得分:1)

请记住使用更适合您需求的量词:

  • *零次或多次重复
  • +一次或多次重复
  • {m}完全重复
  • {m,n}从m到n次重复

如果您确定日期的格式为&#34; dd MMM yyyy&#34;,您的模式应表示为:

@"Date:\s(?'date'\d{2}\s\w{3}\s\d{4})"

或者您可以使用:

@"Date:\s(?'date'\d+\s\w+\s\d+)"

哪个不太严格,但要确保匹配组中要捕获的3个部分存在。

由于其贪婪的性质,使用*时必须格外小心,否则您会发现正则表达式的匹配程度超出您的预期。