C# 分析字符串的一部分

本文关键字:一部分 字符串 | 更新日期: 2023-09-27 18:30:31

我们有一个打印出日志行的应用程序。 在日志行中,我们还以 xml 格式打印出完全同步的 ML 有效负载。 我只需要解析出同步ML有效负载。 实际的xml并剥离其他所有内容。

日志行如下所示。

`2016-01-06T15:13:45.188-0500 [DEBUG] {} Logger
[{{Correlation,(longID)}{Uri,POST (post
URL)}{host,(HOST)}{userID,(userID)}}] - request class SyncML: <?xml
version="1.0" encoding="UTF-8" standalone="yes"?></ns3:SyncML>`

我的请求类正则表达式如下。

 Regex request = new Regex(@"request class SyncML");
   String line;
   while ((line = sr.ReadLine()) != null)
   {
    if(req.Success)
     {
         Match req = request.Match(line);
         string s = line.Substring(line.IndexOf("<?xml "));
     }
   }

request.Match(line) 之后,在 VS 中它显示整行。 所以我知道这场比赛是一场真正的成功。

但是,当我这样做时line.SubString(line.IndexOF...我就会System.ArgumentOutOfRangeException. 当我检查打印出索引时,它是-1。

也许我用错了。 我想我的问题是我需要做什么才能删除之前的所有内容

C# 分析字符串的一部分

如果 " <?xml " 字符串在下一行开始,请使用以下命令:

Regex request = new Regex(@"request class winmo.SyncML");
String line;
while ((line = sr.ReadLine()) != null)
{
 if(req.Success)
 {
  Match req = request.Match(line);
  var xmlLine = line = sr.ReadLine();
  if (null == xmlLine) break;
  string s = xmlLine.Substring(line.IndexOf("<?xml "));
 }
}

或者,您可以针对新编辑的示例改进正则表达式:

Regex request = new Regex(@"^.+request class winmo.SyncML[^'<]+('<'?xml [^`]+)`");
string line;
while ((line = sr.ReadLine()) != null)
{
 Match req = request.Match(line);
 if(req.Success)
  string s = req.Group[1].Value;
}

此外,您可以使用改进的正则表达式一次搜索多行:

Regex request = new Regex(@"^.+request class winmo.SyncML[^'<]+('<'?xml [^`]+)");
var lines = new List<String>(5);
string line;
while ((line = sr.ReadLine()) != null)
{
 //NOTE:You'll need to make sure this gets enough of your log file to get what you want
 lines.Add(line);
 while(lines.Count>4) 
    lines.RemoveAt(0);
 Match req = request.Match(string.Join("'r'n", lines);
 if(req.Success)
  string s = req.Group[1].Value;
}

也许你想要这样的东西:

String line;
while ((line = sr.ReadLine()) != null)
{
  if(line.Contains("<?xml "))
  {
      string s = line.Substring(line.IndexOf("<?xml "));
      // do something useful with s
  }
}

你的正则表达式看起来不对,它应该是正则表达式请求 = 新的正则表达式(@"请求类 SyncML");

尝试使用

"<?xml" 

而不是

"<?xml "

,我在 xml 之后看不到那个空格。

此问题已经过编辑。因此,如果字符串的格式为几行,则应执行以下操作:

while((line = sr.ReadLine))!= null){
    if(req.Success){
         Math req = request.Match(line);
         if(line.contains("<?xml")){
              stirng s = line.Substring(line.IndexOf(@"<?xml"));
         }
    }
}

如果您将整个日志作为长字符串,则可以将substring(x)indexof(string)一起使用,以去除您感兴趣的区域之前的所有内容。我从您的最后一行中假设初始日志信息之后的所有内容都是所需 xml 的一部分。

string sFullLog = ReadFullLogAsASingleString();//Could be taxing in large logs
string sXML = sFullLog.Substring(sFullLog.IndexOf("<?xml"));

我看到提供的示例是单个日志条目,并且该日志条目具有 intrest 的 xml。