对字符串的正则表达式

时间:2011-10-07 18:49:23

标签: c# regex

我对正则表达式比较新,所以请原谅。

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

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

        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*                  

如果有人能告诉我这是错的,我会非常感激。提前谢谢。

4 个答案:

答案 0 :(得分:1)

如果您需要这么简单,请不要使用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);
      }
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

string [] parts = Regex.Split(line,@“(?=(?<!^\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]元素。

匹配所有上下文中可以使用以下内容进行更有意义的操作:

(?:^\s*|(?<=\n))\s*(PA11.*?)(?=\n+PA11|$)
使用单行修饰符或将.*?更改为[\S\s]*?

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

答案 3 :(得分:0)

在我看来,它不是插入换行符而是插入空白条目。你的正则表达式匹配输入的最开头,因为第一行以PA11开头,并且它不消耗任何字符,因此parts数组中的第一项是空字符串。您应该可以通过强制正则表达式使用某些字符来阻止这种情况,例如PA11行之前的换行符:

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

...或确保它与不匹配,除非PA11之前有换行符:

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