如何从字符串中提取文本?

时间:2012-08-09 21:26:42

标签: c# .net

我有这段代码:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = "GET";
    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    string content = reader.ReadToEnd();
    int start = content.IndexOf("profile/");
    int end = content.IndexOf("'");
    string result = content.Substring(start, end - start - 1);
    reader.Close();
    response.Close();
}

例如我的排长队:

<span class="message-profile-name" ><a  href='/profile/daniel'>daniel</a></span>: <span class="message-text">hello everyone<wbr/> <img class='emoticon emoticon-tongue' src='/t.gif'/></span>

我想用以下内容构建一个新字符串:daniel hello everyone

我该怎么办? 在我的代码中,它可以解决错误异常

  

ArgumentOutOfRangeException长度不能小于零。参数   名称:长度

在线:string result = content.Substring(start, end - start - 1); 在这种情况下:start = 19572 end = 2110

3 个答案:

答案 0 :(得分:1)

使用HtmlAgilityPack而不是尝试手动解析。

var wc = new WebClient();

wc.DownloadStringCompleted += (s, e) =>
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(e.Result);

    var link = doc.DocumentNode
                    .SelectSingleNode("//span[@class='message-profile-name']")
                    .Element("a")
                    .Attributes["href"].Value;
};

wc.DownloadStringAsync(new Uri("http://chatroll.com/rotternet"));

答案 1 :(得分:0)

使用适当的工具将符号数组拆分为有意义的 for your 数据数组。

您可以使用HtmlAgilityPack 解析字符串并返回有意义令牌树。

您可以迭代它们并根据您自己的逻辑聚合到结果字符串中。

答案 2 :(得分:0)

看起来您想要的字符串将始终包含在格式为 profile / xxx 的href中,一旦您将内容转换为文本格式,使用正则表达式就会很简单即使你有可能拥有多个&lt; a href = ...&gt; 元素,仍然可以工作

Match match = Regex.Match(content, @"(?<=<a\s*?href='/profile/\w*?'>\s*?)\w*?(?=\s*?<\s*?/a\s*?>)");
string result = match.Value;

将匹配所有粗体, .Value 将返回元素的值,在这种情况下 daniel ,您也可以使用(i?)强制使用正则表达式使其不区分大小写以匹配列表中的最后一项

  • &lt; a href ='/ profile / daniel'&gt; daniel&lt; / a&gt;
  • &lt; a href ='/ profile / danielbc'&gt; daniel&lt; / a&gt;
  • &lt; a href ='/ profilex / danielbc'&gt; daniel&lt; / a&gt;
  • &lt; a href ='/ profile / danielbc'&gt;丹尼尔&lt; / a&gt;
  • &lt; a href ='/ profile / danielbc'&gt; daniel&lt; / a&gt;
  • &lt; a href ='/ PROFILE / danielbc'&gt;丹尼尔&lt; / a&gt;

<强>更新

要从任何其他类型的元素中获取内容,只需替换突出显示的部分以匹配元素,(?&lt; = &lt; a \ s *?href ='/ profile / \ w *?' &GT; \ S * )\ W *(= <强> \ S *&LT;????\ S * /一个\ s *&gt;有)。在您的情况下,"message-text">hello everyone<wbr/>将是(?i)(?&lt; = “message-text”\ s *?&gt; \ s *? * ?(= <强> \ S *&LT;?\ S * / WBR \ S *&gt;有)< / em>,这将从以下变体获得 hello everyone 。*?表示匹配任何内容(包括空格和标点符号),但尽可能少。请注意,我从您的回复中更改了结束标记,如果它应该 而不是 ,那么您可以进行微小的更改以使其正常工作

  • “message-text”&gt;大家好&lt; / wbr&gt;
  • &lt; wbr asdfjlds“message-text”&gt; hello everyone&lt; / wbr&gt;
  • &lt; wbr“message-text”&gt; hello everyone&lt; / wbr&gt;