使用streamreader查找字符串的有效方法

时间:2011-08-04 23:57:58

标签: c#

我获得了网络响应并使用streamreader来获取字符串

的响应

我的代码是

HttpWebResponse response = (HttpWebResponse) request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string strResponse = reader.ReadToEnd();

字符串样本是

<div class="box-round">
<ol  style="list-style-type: decimal;list-style-position:outside;margin-left:42px;">
<li>Order ID #A123456 already exists: Update performed
</ol>
</div>

<div class="box-round">
    <ol  style="list-style-type: decimal;list-style-position:outside;margin-left:42px;">
    <li>New order created
    </ol>
</div>

我想在字符串

中找到以下行
Order ID #A123456 already exists: Update performed

New order created

这是搜索行的最佳方式

  while (!reader.EndOfStream)
    {
        line = reader.ReadLine();
        if (!string.IsNullOrEmpty(line))
        {

        }
    }

3 个答案:

答案 0 :(得分:6)

好吧,我个人会用:

string line;

while ((line = reader.ReadLine()) != null)
{
    if (line.Contains(...))
    {
    }
}

读取该行会为您提供数据会告诉您是否已到达流的末尾。我同意Jeff的观点 - 通过逐行阅读“解析”HTML通常是一个坏主意。当然,可能在你的特定情况下足够好。

答案 1 :(得分:1)

以下是如何使用正则表达式,确保正则表达式不是最好的方法,但如果这是一次使用html解析器的事情可能比你讨价还价更多

Match myMatch = Regex.Match(input, 
       @"<div class=""box-round"">.*?<li>(.*?)</ol>", Regex.Singleline);

if (myMatch.Success)
{

}

答案 2 :(得分:0)

这实际上取决于 - 您是否需要知道DOM中您的特定文本所在的位置?输入有多大?你的字符串是否会在两行之间分开?

如果您只关心文本的存在,并且您的输入足够小以驻留在内存中,那么我只需将整个内容读入内存。我不确定CLR用于进行字符串匹配的确切算法是什么,但是一些更快的例程涉及预处理查询和要搜索的字符串,并且有更多的预处理信息可能会产生更快的搜索。

当然,这一切都取决于CLR内部和您的特殊要求 - 测试,测试,测试。

如果您想捕获有关文本及其与周围文档的关系的更多信息,我建议您查看HtmlAgility库以解析文档。