C# 用于查找消息标识符的正则表达式

C# 用于查找消息标识符的正则表达式,c#,.net,regex,C#,.net,Regex,请一位正则表达式专家帮我解决这个问题,我完全受够了 以下是文本中的一个示例: BO_ 2617247491 Msg_06: 8 DataloggerConfiguration SG_ DL_error_active_3 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX SG_ DL_error_active_2 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX SG_ DL_er

请一位正则表达式专家帮我解决这个问题,我完全受够了

以下是文本中的一个示例:

BO_ 2617247491 Msg_06: 8 DataloggerConfiguration
 SG_ DL_error_active_3 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_active_2 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_active_1 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_active_0 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_5 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_4 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_3 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_2 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_1 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_0 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX

BO_ 2617248003 Msg_08: 8 DataloggerConfiguration
 SG_ DL_gl_err_rea : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_gl_err_rea_hi : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX

BO_ 617247747 Msg_07: 8 DataloggerConfiguration
 SG_ DL_error_code_11 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_10 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_6 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_di_nr_of_active_entries : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_9 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_8 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
 SG_ DL_error_code_7 : 11|8@1+ (1,0) [0|1111] "[-]" Vector__XXX
我试图找到那些消息标识符(在BO_之后是10位num),它们后面的任何地方都有一个DL_错误代码

据我所知,这是一个正则表达式:


(?一个选项可以是使用捕获组

^BO_ (\d{10}).*(?:\r?\n(?!\s*BO_|.*?DL_error_code).*)*\r?\n.*?DL_error_code
模式匹配:

  • ^
    字符串的开头
  • BO
    逐字匹配
  • (\d{10})
    捕获组1中的10个数字
  • *
    匹配行的其余部分
  • (?:
    非捕获组作为一个整体重复
    • \r?\n
      匹配换行符
    • (?!\s*BO|.*DL_error_code)。*
      如果它不是以
      BO_
      开头或包含DL_error_code>代码,则匹配整行
  • )*
    关闭组并可选地重复
  • \r?\n.*DL\u error\u code
    匹配包含DL\u error\u code的行
|

请注意,第二项有9位数字
617247747

如果要匹配,还可以使用
\d+
而不是匹配1个或多个数字的
\d{10}

string pattern = @"^BO_ (\d{10}).*(?:\r?\n(?!\s*BO_|.*?DL_error_code).*)*\r?\n.*?DL_error_code";
string input = @"...";

foreach (Match m in Regex.Matches(input, pattern, options))
{
    Console.WriteLine(m.Groups[1].Value);
}
输出

2617247491

一种选择是使用捕获组

^BO_ (\d{10}).*(?:\r?\n(?!\s*BO_|.*?DL_error_code).*)*\r?\n.*?DL_error_code
模式匹配:

  • ^
    字符串的开头
  • BO
    逐字匹配
  • (\d{10})
    捕获组1中的10个数字
  • *
    匹配行的其余部分
  • (?:
    非捕获组作为一个整体重复
    • \r?\n
      匹配换行符
    • (?!\s*BO|.*DL_error_code)。*
      如果它不是以
      BO_
      开头或包含DL_error_code>代码,则匹配整行
  • )*
    关闭组并可选地重复
  • \r?\n.*DL\u error\u code
    匹配包含DL\u error\u code的行
|

请注意,第二项有9位数字
617247747

如果要匹配,还可以使用
\d+
而不是匹配1个或多个数字的
\d{10}

string pattern = @"^BO_ (\d{10}).*(?:\r?\n(?!\s*BO_|.*?DL_error_code).*)*\r?\n.*?DL_error_code";
string input = @"...";

foreach (Match m in Regex.Matches(input, pattern, options))
{
    Console.WriteLine(m.Groups[1].Value);
}
输出

2617247491

我已经解析文本文件40多年了。可以使用字符串方法时应使用字符串方法,如果字符串方法不起作用时应使用正则表达式。正则表达式并不总是最佳答案。请参阅下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);

            string line = "";
            List<BO> bos = new List<BO>();
            BO bo = null;
            string[] splitLine = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("BO"))
                    {
                        bo = new BO();
                        bos.Add(bo);
                        splitLine = line.Split(new char[] { ' ' }).ToArray();
                        bo.number = splitLine[1];
                    }
                    else
                    {
                        if (line.Contains("DL_error_code"))
                        {
                            splitLine = line.Split(new char[] { ':' }).ToArray();
                            if (bo.de_error_codes == null) bo.de_error_codes = new List<string>();
                            bo.de_error_codes.Add(splitLine[1].Trim());
                        }
                    }
                }
            }
        }
    }
    public class BO
    {
        public string number { get; set; }
        public List<string> de_error_codes { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Text.RegularExpressions;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.txt”;
静态void Main(字符串[]参数)
{
StreamReader=新的StreamReader(文件名);
字符串行=”;
List bos=新列表();
BO=null;
string[]splitLine=null;
而((line=reader.ReadLine())!=null)
{
line=line.Trim();
如果(直线长度>0)
{
if(第行开始与(“BO”))
{
bo=新的bo();
增加(bo);
splitLine=line.Split(新字符[]{''}).ToArray();
bo.number=分割线[1];
}
其他的
{
if(行包含(“DL\U错误代码”))
{
splitLine=line.Split(新字符[]{':'}).ToArray();
如果(bo.de_error_code==null)bo.de_error_code=new List();
bo.de_error_code.Add(拆分行[1].Trim());
}
}
}
}
}
}
公共类BO
{
公共字符串编号{get;set;}
公共列表错误代码{get;set;}
}
}

我解析文本文件已经40多年了。可以使用字符串方法时应使用字符串方法,如果字符串方法不起作用时应使用正则表达式。正则表达式并不总是最佳答案。请参阅下面的我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);

            string line = "";
            List<BO> bos = new List<BO>();
            BO bo = null;
            string[] splitLine = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("BO"))
                    {
                        bo = new BO();
                        bos.Add(bo);
                        splitLine = line.Split(new char[] { ' ' }).ToArray();
                        bo.number = splitLine[1];
                    }
                    else
                    {
                        if (line.Contains("DL_error_code"))
                        {
                            splitLine = line.Split(new char[] { ':' }).ToArray();
                            if (bo.de_error_codes == null) bo.de_error_codes = new List<string>();
                            bo.de_error_codes.Add(splitLine[1].Trim());
                        }
                    }
                }
            }
        }
    }
    public class BO
    {
        public string number { get; set; }
        public List<string> de_error_codes { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Text.RegularExpressions;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.txt”;
静态void Main(字符串[]参数)
{
StreamReader=新的StreamReader(文件名);
字符串行=”;
List bos=新列表();
BO=null;
string[]splitLine=null;
而((line=reader.ReadLine())!=null)
{
line=line.Trim();
如果(直线长度>0)
{
if(第行开始与(“BO”))
{
bo=新的bo();
增加(bo);
splitLine=line.Split(新字符[]{''}).ToArray();
bo.number=分割线[1];
}
其他的
{
if(行包含(“DL\U错误代码”))
{
splitLine=line.Split(新字符[]{':'}).ToArray();
如果(bo.de_error_code==null)bo.de_error_code=new List();
bo.de_error_code.Add(拆分行[1].Trim());
}
}
}
}
}
}
公共类BO
{
公共字符串编号{get;set;}
公共列表错误代码{get;set;}
}
}
你的正则表达式没有包含文本的原因是什么?我认为这很简单:
你的正则表达式没有包含文本的原因是什么