如何从阅读所有行的文本文件中解析特定字符串?

时间:2016-06-25 18:33:55

标签: c# .net winforms

在每一行中,我想在标记

  • 之后解析字符串 我知道它的HTML,但我将这部分html复制到文本文件中。 例如,文本文件中的前两行是这样的:

    <li>602 — <a href="/w/index.php?title=Text602&amp;action=edit&amp;redlink=1" class="new" title="Text602 (page does not exist)">Text602</a> document</li>
    <li>ABW — <a href="/wiki/AbiWord" title="AbiWord">AbiWord</a> Document</li>
    

    我想从第一行解析602,从第二行解析ABW。 我试图做的是:

    private void ParseFilesTypes()
            {
                string[] lines = File.ReadAllLines(@"E:\New folder (44)\New Text Document.txt");
                foreach (string str in lines)
                {
                    int r = str.IndexOf("<li>");
                    if (r >= 0)
                    {
                        int i = str.IndexOf(" -", r + 1);
                        if (i >= 0)
                        {
    
                            int c = str.IndexOf(" -", i + 1);
                            if (c >= 0)
                            {
                                i++;
                                MessageBox.Show(str.Substring(i, c - i));
                            }
                        }
                    }
                }
            }
    

    但是c一直是-1

  • 2 个答案:

    答案 0 :(得分:2)

    我认为这是正则表达式有用的情况(除非没有li属性):

    var regex = new Regex("^<li>(.+) —");
    foreach (string str in lines)
    {
         var m = regex.Match(str);
         if (m.Success)
            MessageBox.Show(m.Groups[1].Value);
    }
    

    答案 1 :(得分:2)

    实际上,您的问题是您正在使用错误编码来阅读该文件。您的文件中有一个特殊字符,而不是-。因此,您需要在代码中更正此字符,并以正确的编码读取文件。如果您使用错误的编码调试读取的字符串,则会看到黑色菱形而不是

    此外,您需要删除之前的空格或将i + 1替换为i;

    private static void ParseFilesTypes()
    {
        string sampleFilePath = @"log.txt";
        string[] lines = File.ReadAllLines(@"log.txt", Encoding.GetEncoding("windows-1252"));
        foreach (string str in lines)
        {
            int r = str.IndexOf("<li>");
            if (r >= 0)
            {
                int i = str.IndexOf(" —", r + 1);
                if (i >= 0)
                {
    
                    int c = str.IndexOf(" —", i);
                    if (c >= 0)
                    {
                        i++;
                        int startIndex = r + "<li>".Length;
                        int length = i - startIndex - 1;
                        string result = str.Substring(r + "<li>".Length, length);
                        MessageBox.Show(result);
                    }
                }
            }
        }
    }