正则表达式使用换行符和空格

时间:2014-12-23 17:21:15

标签: c# regex split

我有一个文本文件,我正在阅读C#程序,我需要拆分它的内容。我决定使用Regex.Split()

我想要寻找的模式是\n( )+Copyright

这是一个文本示例:

  

\ r \ n \ r \ nLANGUAGE:ENGLISH \ r \ n \ r \ nDISTRIBUTION:每个区域\ r \ n \ r \ n \ _出版物类型:报纸\ r \ n \ r \ n \ r \ n版权所有2014 Washingtonpost.Newsweek Interactive Company,LLC d / b / a \ r \ n Washington Post Digital \ r \ n保留所有权利\ r \ n“

包含换行符的原因是因为我还有段落中出现版权一词的情况:

  由Doug Swanson撰写的Blood Aces将于2014年8月14日由Penguin \ r \ nGroup(USA)LLC成员Viking出版。版权所有©2014 Doug J. Swanson 。\ r \ n

然而我遇到的问题是当我执行此调用时:

var splitContent= Regex.Split(filecontent, @"\n( )+Copyright");

我在splitContent中获得的项目数量超过应有的2倍。我已经尝试将正则表达式模式修改为@"(\n){1}?( )+Copyright"以及其他一些类似的类型模式,我得到splitContent中应该得到的项目数量的4-5倍。

这是执行此类正则表达式的正确方法吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

  

如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“plum-pear”,则返回的数组包含一个包含连字符的字符串元素。

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = "plum-pear";
      string pattern = "(-)";

      string[] substrings = Regex.Split(input, pattern);    // Split on hyphens 
      foreach (string match in substrings)
      {
         Console.WriteLine("'{0}'", match);
      }
   }
}
// The example displays the following output:
//    'plum'
//    '-'
//    'pear'
     

Regex.Split

答案 1 :(得分:0)

为什么要尝试重新发明轮子?只需更改正则表达式即可使用正确的选项:

RegexOptions options     = RegexOptions.Multiline
                         | RegexOptions.Ignorecase
                         ;
Regex        rxCopyright = new Regex( "^\s*Copyright", options );

string[]     lines       = rxCopyright.Split( yourStringHere ) ;

RegexOptions.Multiline告诉正则表达式引擎

  

使用多行模式,^$匹配开头和结尾   每行(而不是输入字符串的开头和结尾)。   有关详细信息,请参阅Multiline Mode

因此,如果在任何行的开头(有或没有前导空格),您的文本语料库将使用单词copyright拆分为块。

如果您想使用括号清晰,请将RegexOptions.ExplicitCapture添加到混音中。它

  

指定仅显式命名或编号的唯一有效捕获   形式为(?<name>…)的组。这允许未命名的括号充当非捕获组,而没有表达式(?:…)的语法笨拙。