捕获字符串中的两个块

时间:2014-06-10 19:59:56

标签: c# .net regex

我有一个以这种格式的字符串:

  

消息:在This.Place<中发生了一些不好的事情。描述>这里有某种信息< /说明><错误>其他一些东西< /错误><消息>这里有一些消息。

我似乎无法弄清楚如何使用正则表达式匹配Description块中的所有内容以及Message块中的所有内容。

我的问题分为两部分:1。)正则表达式是正确的选择吗?                              2.)如果是这样,我如何匹配这两个块并排除其余块?


我可以将第一部分与简单的<描述&GT。* LT; / Description>,但无法匹配<消息取代。我试图通过尝试使用此处描述的http://blog.codinghorror.com/excluding-matches-with-regular-expressions/

来排除中间的所有内容

3 个答案:

答案 0 :(得分:0)

关于在正则表达式中解析xml的所有免责声明,使用正则表达式知道如何做到这一点仍然很好。

例如,如果你的背靠墙,这适用于< Description>标签(适用于其他标签)。

(?<=< Description>).*?(?=< /Description>)

您需要了解的一些事项:

  1. (?<=< Description>)是一个后视者,断言在字符串中的那个位置,前面的是< Description>。因此,如果您更改标记中的空格,则所有投注均已关闭。要处理潜在的输入错误(取决于文本的来源),您可以插入可选空格:(?<=< *Description *>)其中*重复空格字符零次或多次。 lookbehind只是一个断言,它不消耗任何字符。
  2. .*?懒惰地吃掉所有角色,直到找到后面的内容......
  3. 哪个(?=< /Description>)前瞻断言在字符串中的那个位置,接下来是< /Description>
  4. 在代码中,这就像:

    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当然:))