我有一个文本文件,我正在阅读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倍。
这是执行此类正则表达式的正确方法吗?
非常感谢任何帮助。
答案 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'
答案 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>…)
的组。这允许未命名的括号充当非捕获组,而没有表达式(?:…)
的语法笨拙。