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。
也许我用错了。 我想我的问题是我需要做什么才能删除之前的所有内容
如果 " <?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。