正则表达式组字符串

正则表达式组字符串

问题描述:

我对正则表达式相对较新,所以请原谅。正则表达式组字符串

我目前正在尝试根据记录行对每一行进行分组。因此,例如,我希望将记录行的所有行分组为一个字符串,直到下一条记录行。我一直在尝试使用正则表达式,并且获得了与我想要的非常接近的结果,但是,在我正在读取它的数组的开始处存在一个换行符。

这是我用来分割数据的代码。

 using (StreamReader sr = new StreamReader(file)) 
     { 
      string line; 
      line = sr.ReadToEnd(); 
      string[] parts = Regex.Split(line, @"(?=PA11)"); 

      List<string> parameterList = new List<string>(parts); 

      foreach (string s in parameterList) 
      { 
       listBox1.Items.Add(s); 
      } 
     } 

这是结果是这样的:

*newline* 
LINE 000001 000001 TEST A B TEST OUTPUT *More Lines*     
LINE 000002 000002 TEST A B TEST OUTPUT *More Lines*     

如果有人能告诉我这是什么,我做错了,我将不胜感激。先谢谢你。

在我看来,它不是插入一个换行而是一个空白条目。因为第一行以PA11开头,并且它不会消耗任何字符,所以parts数组中的第一项是空字符串,因此您的正则表达式与输入的开始位置相匹配。您应该能够防止通过迫使正则表达式来消耗一些字符,如PA11行之前的新行:

string[] parts = Regex.Split(line, @"[\r\n]+(?=PA11)"); 

...或者确保它不匹配除非PA11前一个换行符:

string[] parts = Regex.Split(line, @"(?<=[\r\n])(?=PA11)"); 
+0

我尝试了第一个正则表达式,它似乎工作正常。我刚刚意识到我遗漏了一些重要的信息。在任何PA11字段之前有3个标题行,但这似乎不影响您给我的陈述。我必须解决的唯一问题是,在编辑后将文件放回到一起时,文件末尾会有一个额外的换行符。感谢您的帮助。 – almostProgramming

+0

不好意思,但我通过使用RemoveAt(list.Count - 1)发现了一个额外的新行的简单修复。再次感谢。 – almostProgramming

如果您的需求很简单,请不要使用REGEX。

using (StreamReader sr = new StreamReader(file)) 
{ 
    string line = sr.ReadLine(); 
    while(line != null){ 
    if(line.StartsWith("PA11")){ 
     string[] parts = line.Split(" "); 
     List<string> parameterList = new List<string>(parts); 

     foreach (string s in parameterList) 
       listBox1.Items.Add(s); 
     } 
    } 
} 
+0

好主意。几件事。首先,不是使用'StreamReader',而是使用'foreach(File.ReadLines(file)中的var行)'。其次,为什么只要写'foreach(var s in parts)'''''''''''''''''''就可以创建'List ''? –

+0

此代码似乎不适合我。当我运行它时,程序就冻结了。 – almostProgramming

+0

我懒懒地使用现有的代码,主要的一点是使用.StartsWith(..)方法,而不是正则表达式。 –

为什么不使用string.split? string [] parts = line.split(“PA11”).. 您可以将dem demter重新插入每个部分。

它创建一个空的[0]元素的原因是在字符串的开头可能有空格(换行符)。
的下面将工作,代码测试这里 - >http://www.ideone.com/tsOlI(我没有.NET专家)

串[]份= Regex.Split(线,@ “(?=(?<!^\s*)PA11)”);

扩展为:

(?=   # look ahead, we're at the first 'PA11' 
    (?<!^\s*)  # before its ok, there can't be '^\s*' before us 
    PA11   # ok, this 'PA11' is good to split 
)   # end look ahead 

请注意,如果有空白比任何其他第一PA11之前,
它会创建一个[0]与该块状元件。

这可能是一个小更meaningfull做过一个比赛所有情况下像这样的东西:

(?:^\s*|(?<=\n))\s*(PA11.*?)(?=\n+PA11|$)
采用单线修饰或改变.*?[\S\s]*?

它只会从开始匹配块到在下一个开始(或字符串的结尾)之前 并去除剩余边界空白字符。