小消息解析器,什么不好?

时间:2009-07-08 23:38:25

标签: c#

我做了一个小的解析器,它将通过一条消息并用某个用户替换$ user等等。

除了基本关键字,我希望它替换这样的日期: $ datemo10,今天的日期加上10个月 $ datedd03,今天的日期加上3天 $ datehh07,今天的日期加上7个小时 $ datemm12,今天的日期加上12分钟 $ datess15,今日日期加15秒

这就是我的工作......

    const string Identifier = "$";
    const string TimeFormat = "HH:mm:ss dd-MM-yyyy";

    public static string Encode(string Author, string Recipent, string input)
    {
        Dictionary<string, string> keywords = new Dictionary<string, string>();
        keywords.Add("bye", "With kind regards " + identify("me"));
        keywords.Add("user", Recipent);
        keywords.Add("me", Author);
        keywords.Add("now", DateTime.Now.ToString(TimeFormat));
        keywords.Add("date", "");

        string result = input;
        foreach (KeyValuePair<string, string> keyword in keywords)
        {
            if (keyword.Key.ToLower() == "date")
            {
                int addedLength = 0;
                foreach (Match match in Regex.Matches(input, "\\" + identify(keyword.Key)))
                {
                    string mode = input.Substring(match.Index + addedLength + match.Length, 2);
                    string stringInteger = input.Substring(match.Index + addedLength + match.Length + 2, 2);
                    int integer;
                    if (int.TryParse(stringInteger, out integer) && !mode.Contains(" "))
                    {
                        if (mode == "ss")
                        {
                            string dateTime = DateTime.Now.AddSeconds(Convert.ToDouble(integer)).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                        else if (mode == "mm")
                        {
                            string dateTime = DateTime.Now.AddMinutes(Convert.ToDouble(integer)).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                        else if (mode == "hh")
                        {
                            string dateTime = DateTime.Now.AddHours(Convert.ToDouble(integer)).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                        else if (mode == "dd")
                        {
                            string dateTime = DateTime.Now.AddDays(Convert.ToDouble(integer)).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                        else if (mode == "mo")
                        {
                            string dateTime = DateTime.Now.AddMonths(integer).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                        else if (mode == "yy")
                        {
                            string dateTime = DateTime.Now.AddYears(integer).ToString(TimeFormat);
                            input = input.Remove(match.Index + addedLength, match.Length + 4);
                            input = input.Insert(match.Index + addedLength, dateTime);
                            addedLength += (dateTime.Length - (match.Length + 4));
                        }
                    }
                }
            }
            else
            {
                input = Regex.Replace(input, "\\" + identify(keyword.Key), keyword.Value);
            }
        }

        return input;
    }

    protected static string identify(string val)
    {
        return Identifier + val;
    }

我觉得保留需要在字典中替换的关键字很好,但我真的不喜欢我解析和替换日期的方式。

但是作为整个编程世界的新手,这是我能够使其发挥作用的唯一方式。虽然我完全能够理解为什么它会变得更好,如果你对如何让它以一种不那么黑的方式工作有任何想法,请告诉我:)

撕裂它,但请在建设性的事情中这样做。 我怎样才能让它变得更好?

我知道有相当多的重复代码..嘘

谢谢:)

1 个答案:

答案 0 :(得分:0)

我建议查看http://msdn.microsoft.com/en-us/library/system.timespan.aspx 以及其他msdn库,了解有关您要执行的操作的更多信息。他们有很好的例子和所有.net库的所有信息。

对于初学者来说,你应该把重复的代码放到它自己的函数中,这样你就不会重复了,如果我在编程时多次触摸ctrl + c键,我发现我做错了。

另外,您是刚刚获得当前日期并为每小时minuet ext ext添加时间。如果你在每个日期添加一些时间,我认为你可以更容易地做到这一点

我认为c#有一个通用的datetime.add函数可以用来添加 一个时间跨度。时间跨度由所有$ datedd03 $ datehh07部分组成。我还在学习c#所以我对c#不太好,所以对datetime更有经验的人应该能够帮助更多

顶部的链接包含有关时间跨度功能的信息。