正则表达式组字符串

本文关键字:字符串 正则表达式 | 更新日期: 2023-09-27 18:10:47

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

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

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

        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*                  

如果有人能告诉我我做错了什么,我将非常感激。

正则表达式组字符串

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

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

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

…或者通过确保它不匹配,除非PA11:

之前有一个换行符。
string[] parts = Regex.Split(line, @"(?<=['r'n])(?=PA11)");

为什么不使用string.split呢?string[] parts = line.split("PA11")..

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

string[] parts =正则表达式。分割(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]元素。

match all上下文中可以这样做更有意义:

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

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