【问题标题】:regex use with newlines and spaces正则表达式与换行符和空格一起使用
【发布时间】:2014-12-23 17:21:14
【问题描述】:

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

我正在寻找的模式是\n( )+Copyright

下面是文本示例:

\r\n\r\n语言:英语\r\n\r\n发行:每个区域\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"

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

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

但是我遇到的问题是当我执行这个调用时:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 为什么要在括号中加上空格?任何捕获的组也放入结果数组中。
  • 我把它放在括号里是为了更好地在视觉上识别空间......我不知道它也会把它放在数组中
  • @PetSerAl 谢谢!我刚刚删除了括号,它完全按照我需要的方式工作。感谢您让我知道捕获的组也被添加到结果数组中!
  • 有什么理由不使用String.Split()
  • 期望结果是什么?向我们展示一些示例文本、预期结果以及您实际得到的结果。

标签: c# regex split


【解决方案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

【讨论】:

    【解决方案2】:

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

    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>…) 形式的组。这允许未命名的括号充当非捕获组,而不会像 (?:…) 表达式那样在语法上笨拙。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多