[2010-8-6 16:49:35] Kelvin: 1011aasfsadfasdfasdfsd
[2010-8-6 16:51:48] ebayb: 第一行第二行第三行[2010-8-6 16:52:22] Kelvin: OK
这是一个聊天记录的文本文件,如可来获取每一条聊天记录?
时间,用户名,聊天内容。

解决方案 »

  1.   


                string str = "[2010-8-6 16:49:35] Kelvin: 1011aasfsadfasdfasdfsd";            Regex reg = new Regex(@"(\[.*?\]) (\w*): (.*)");            foreach (Match m in reg.Matches(str))
                {
                    Console.WriteLine(m.Groups[1].Value.Trim(']').Trim('['));
                    Console.WriteLine(m.Groups[2].Value);
                    Console.WriteLine(m.Groups[3].Value);
                }
      

  2.   

    Regex reg = new Regex(@"(?isn)\[(?<datetime>\d{4}-([1-9]|1[012])-([1-9]|[1-3][0-9]) (\d|1[0-9]|2[012])(:[1-5]?\d){2})\]\s*(?<name>[^:]+)\s*:\s*(?<text>.+?)(?=\[\d{4}-([1-9]|1[012])-([1-9]|[1-3][0-9]) (\d|1[0-9]|2[012])(:[1-5]?\d){2}\]|$)");
    MatchCollection mc = Regex.Matches(yourStr);
    foreach(Mathch m in mc)
    {
        //m.Groups["datetime"].Value就是时间日期部分
        //m.Groups["name"].Value就是说话的人名
        //m.Groups["text"].Value就是正文内容 
    }
      

  3.   

    2楼贴的,就是取了一条记录,同时把时间日期、说话的人、内容,一同区分分组了。
    除了写给你那么清晰明了的,m.Value就是一条完整的纪录。
      

  4.   

    创建控制台程序,粘贴即可看到效果。using System;
    using System.Text.RegularExpressions;public class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string yourStr = @"[2010-8-6 16:49:35] Kelvin: 1011aasfsadfasdfasdfsd
    [2010-8-6 16:51:48] ebayb: 第一行";
            Regex reg = new Regex(@"(?isn)\[(?<datetime>\d{4}-([1-9]|1[012])-([1-9]|[1-3][0-9]) (\d|1[0-9]|2[012])(:[1-5]?\d){2})\]\s*(?<name>[^:]+)\s*:\s*(?<text>.+?)(?=\[\d{4}-([1-9]|1[012])-([1-9]|[1-3][0-9]) (\d|1[0-9]|2[012])(:[1-5]?\d){2}\]|$)");
            MatchCollection mc = reg.Matches(yourStr);
            foreach (Match m in mc)
            {
                Console.WriteLine("[一条数据的完整内容]");
                Console.WriteLine(m.Value);//完整内容
                Console.WriteLine("[时间日期]");
                Console.WriteLine(m.Groups["datetime"].Value);//m.Groups["datetime"].Value就是时间日期部分
                Console.WriteLine("[说话人]");
                Console.WriteLine(m.Groups["name"].Value);//m.Groups["name"].Value就是说话的人名
                Console.WriteLine("[说的内容]");
                Console.WriteLine(m.Groups["text"].Value);//m.Groups["text"].Value就是正文内容 
                Console.WriteLine("-------------------神奇的分割线-------------------");
            }
            Console.ReadKey();
        }
    }输出:[一条数据的完整内容]
    [2010-8-6 16:49:35] Kelvin: 1011aasfsadfasdfasdfsd[时间日期]
    2010-8-6 16:49:35
    [说话人]
    Kelvin
    [说的内容]
    1011aasfsadfasdfasdfsd-------------------神奇的分割线-------------------
    [一条数据的完整内容]
    [2010-8-6 16:51:48] ebayb: 第一行
    [时间日期]
    2010-8-6 16:51:48
    [说话人]
    ebayb
    [说的内容]
    第一行
    -------------------神奇的分割线-------------------
      

  5.   

    (?isn)什么意思?
    [2010-8-6 16:51:48] ebayb 全发中国邮政I92A: friend!
    这个匹配出来怎么出现了乱码:
    [2010-8-6 16:51:48] ebayb ????й?????I92A: friend!
      

  6.   

    (?isn)
    是模式修饰
    i:忽略大小写
    s:单行模式.可以捕获\n
    n:取消未命名分组捕获。减少堆栈创建。
    如果你原文没错。就不会有错,你读文件时候是不是Encoding用的不对。