C#Regex用特定的文本块替换特定的主题标签

时间:2017-06-15 19:34:17

标签: c#

我是一名新的C#开发人员,我现在正在努力编写一种方法,用某些文本块替换推文样本中的一些特定主题标签。例如,如果推文有像#StPaulSchool这样的标签,我想用这个特定的文本" St替换这个#标签。保罗学校"没有'#'标签。 我有一个非常小的单词列表,我需要替换。如果没有匹配,那么我想删除主题标签(用空字符串替换)

我使用以下方法来解析推文并将其转换为格式化的推文,但我不知道如何增强它以处理特定的主题标签。 你能告诉我怎么做吗?

以下是代码:

public string ParseTweet(string rawTweet)
        {
            Regex link = new Regex(@"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?");
            Regex screenName = new Regex(@"@\w+");
            Regex hashTag = new Regex(@"#\w+");

            var words_to_replace = new string[] { "StPaulSchool", "AzharSchool", "WarwiSchool", "ManMet_School", "BrumSchool"};
            var inputWords = new string[] { "St. Paul School", "Azhar School", "Warwick School", "Man Metapolian School", "Brummie School"};

            string formattedTweet = link.Replace(rawTweet, delegate (Match m)
            {
                string val = m.Value;
                //return string.Format("URL");
                return string.Empty;
            });

            formattedTweet = screenName.Replace(formattedTweet, delegate (Match m)
            {
                string val = m.Value.Trim('@');
                //return string.Format("USERNAME");
                return string.Empty;
            });

            formattedTweet = hashTag.Replace(formattedTweet, delegate (Match m)
            {
                string val = m.Value;
                //return string.Format("HASHTAG");
                return string.Empty;
            });

            return formattedTweet;
        }

2 个答案:

答案 0 :(得分:0)

我认为使用正则表达式会使代码难以理解且难以维护。此外,您使用正则表达式来查找非常简单的模式 - 查找以#标签(#)开头的字符串。

我建议采用不同的方法:将句子分解为单词,根据您的业务规则转换每个单词,然后将单词重新组合在一起。虽然这听起来像很多工作,但在另一种语言中可能就是这种情况,但C#String类使这很容易实现。

以下是执行所请求功能的控制台应用程序的基本示例,业务规则是硬编码的,但这应该足以让您继续:

static void Main(string[] args)
{
    string text = "Example #First #Second #NoMatch not a word ! \nSecond row #Second";
    string[] wordsInText = text.Split(' ');
    IEnumerable<string> transformedWords = wordsInText.Select(selector: word => ReplaceHashTag(word: word));
    string transformedText = string.Join(separator: " ", values: transformedWords);
    Console.WriteLine(value: transformedText);
}

private static string ReplaceHashTag(string word)
{
    if (!word.StartsWith(value: "#"))
    {
        return word;
    }
    string wordWithoutHashTag = word.Substring(startIndex: 1);

    if (wordWithoutHashTag == "First")
    {
        return "FirstTransformed";
    }
    if (wordWithoutHashTag == "Second")
    {
        return "SecondTransformed";
    }
    return string.Empty;
}

请注意,这种方法可以更灵活地链接您的逻辑,通过进行小的修改,您可以使这些代码比正则表达式方法更可测试和增量

答案 1 :(得分:0)

以下代码适用于主题标签:

    static void Main(string[] args)
    {
        string longTweet = @"Long sentence #With #Some schools like #AzharSchool and spread out
over two #StPaulSchool lines ";

        string result = Regex.Replace(longTweet, @"\#\w+", match => ReplaceHashTag(match.Value), RegexOptions.Multiline);

        Console.WriteLine(result);
    }

    private static string ReplaceHashTag(string input)
    {
        switch (input)
        {
            case "#StPaulSchool": return "St. Paul School";
            case "#AzharSchool": return "Azhar School";
            default:
                return input; // hashtag not recognized
        }
    }

如果要转换的主题标签列表变得很长,那么使用词典会更加简洁,例如:

    private static Dictionary<string, string> _hashtags
        = new Dictionary<string, string>
              {
                  { "#StPaulSchool", "St. Paul School" },
                  { "#AzharSchool", "Azhar School" },
              };

并使用以下方法重写ReplaceHashTag方法的主体:

        if (!_hashtags.ContainsKey(hashtag))
        {
            return hashtag;
        }

        return _hashtags[hashtag];