我有一个以这种格式的字符串:
消息:在This.Place<中发生了一些不好的事情。描述>这里有某种信息< /说明><错误>其他一些东西< /错误><消息>这里有一些消息。
我似乎无法弄清楚如何使用正则表达式匹配Description块中的所有内容以及Message块中的所有内容。
我的问题分为两部分:1。)正则表达式是正确的选择吗? 2.)如果是这样,我如何匹配这两个块并排除其余块?
我可以将第一部分与简单的<描述&GT。* LT; / Description>,但无法匹配<消息取代。我试图通过尝试使用此处描述的http://blog.codinghorror.com/excluding-matches-with-regular-expressions/
来排除中间的所有内容答案 0 :(得分:0)
关于在正则表达式中解析xml的所有免责声明,使用正则表达式知道如何做到这一点仍然很好。
例如,如果你的背靠墙,这适用于< Description>
标签(适用于其他标签)。
(?<=< Description>).*?(?=< /Description>)
您需要了解的一些事项:
(?<=< Description>)
是一个后视者,断言在字符串中的那个位置,前面的是< Description>
。因此,如果您更改标记中的空格,则所有投注均已关闭。要处理潜在的输入错误(取决于文本的来源),您可以插入可选空格:(?<=< *Description *>)
其中*
重复空格字符零次或多次。 lookbehind只是一个断言,它不消耗任何字符。.*?
懒惰地吃掉所有角色,直到找到后面的内容...... (?=< /Description>)
前瞻断言在字符串中的那个位置,接下来是< /Description>
在代码中,这就像:
description = Regex.Match(yourstring, "(?<=< *Description *>).*?(?=< */Description *>)").Value;
答案 1 :(得分:0)
这就是我解析它的方式。 警告:我已经写了正则表达式,假设您提供的示例中显示的格式非常严格;如果数据变化不大(例如,在&#39;&#39;字符之后总是没有空格),您需要稍微调整一下。但这应该让你前进。
var text = "Message: Something bad happened in This.Place < Description> Some"+
" sort of information here< /Description>< Error> Some other stuff"+
"< /Error>< Message> Some message here.";
var regex = new Regex(
"^.*?<\\sDescription\\>(?<description>.*?)<\\s/Description\\>"+
".*?<\\sMessage\\>(?<message>.*?)$",
RegexOptions.IgnoreCase | RegexOptions.Singleline
);
var matches = regex.Match(text);
if (matches.Success) {
var desc = matches.Groups["description"].Value;
// " Some sort of information here"
var msg = matches.Groups["message"].Value;
// " Some message here."
}
答案 2 :(得分:0)
尝试从文本中删除非XML格式的数据相当困难,因此IndexOf和Substring最终成为我使用的。 IndexOf将查找指定字符或字符串的索引,Substring根据起始点和应捕获的数量来捕获字符。
int descriptionBegin = 0;
int descriptionEnd = 0;
int messageBegin = 0;
int messageEnd = 0;
foreach (string j in errorList)
{
descriptionBegin = j.IndexOf("<Description>") + 13; // starts after the opening tag
descriptionEnd = j.IndexOf("</Description>") - 13; // ends before the closing tag
messageBegin = j.IndexOf("<Message>") + 9; // starts after the opening tag
messageEnd = j.IndexOf("</Message>") - 9; // ends before the closing tag
descriptionDiff = descriptionEnd - descriptionBegin; // amount of chars between tags
messageDiff = messageEnd - messageBegin; // amount of chars between tags
string description = j.Substring(descriptionBegin, descriptionDiff); // grabs only specified amt of chars
string message = j.Substring(messageBegin, messageDiff); // grabs only specified amt of chars
}
感谢@Lucius提出的建议。 @Darryl实际上看起来可能有用。感谢您的全面回答......我可能会尝试将来的其他内容(非XML当然:))