C#Regex将特定的hashtag替换为特定的文本块

C#Regex将特定的hashtag替换为特定的文本块,c#,C#,我是一名新的C#开发者,目前正在努力编写一种方法,用特定的文本块替换tweet示例中的一些特定的hashtag。例如,如果tweet有一个类似#StPaulSchool的标签,我想用没有#标签的特定文本“圣保罗学校”替换这个标签。 我有一个非常小的列表,其中列出了一些我需要替换的单词。如果没有匹配项,那么我想删除hashtag(用空字符串替换) 我正在使用以下方法解析tweet并将其转换为格式化tweet,但我不知道如何增强它以处理特定的hashtag你能告诉我怎么做吗? 代码如下: publi

我是一名新的C#开发者,目前正在努力编写一种方法,用特定的文本块替换tweet示例中的一些特定的hashtag。例如,如果tweet有一个类似#StPaulSchool的标签,我想用没有#标签的特定文本“圣保罗学校”替换这个标签。 我有一个非常小的列表,其中列出了一些我需要替换的单词。如果没有匹配项,那么我想删除hashtag(用空字符串替换)

我正在使用以下方法解析tweet并将其转换为格式化tweet,但我不知道如何增强它以处理特定的hashtag你能告诉我怎么做吗?

代码如下:

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;
        }

我相信使用正则表达式会使这段代码不可读,也很难维护。此外,您正在使用正则表达式查找一个非常简单的模式—查找以hashtag(#)字符开头的字符串

我建议采用一种不同的方法:将句子分解成单词,根据业务规则转换每个单词,然后将单词重新连接在一起。虽然这听起来需要做很多工作,在另一种语言中也可能是这样,但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;
}
static void Main(字符串[]args)
{
string text=“示例#First#Second#NoMatch not word!\n第二行#Second”;
字符串[]wordsInText=text.Split(“”);
IEnumerable transformedWords=wordsInText.Select(选择器:word=>ReplaceHashTag(word:word));
string transformedText=string.Join(分隔符:“”,值:transformedWords);
Console.WriteLine(值:transformedText);
}
私有静态字符串替换hashtag(字符串字)
{
如果(!word.StartsWith(值:“#”))
{
返回词;
}
string wordWithoutHashTag=word.Substring(startIndex:1);
if(wordWithoutHashTag==“First”)
{
返回“FirstTransformed”;
}
if(wordWithoutHashTag==“秒”)
{
返回“SecondTransformed”;
}
返回字符串。空;
}

请注意,这种方法为链接逻辑提供了更大的灵活性,通过进行小的修改,您可以使此代码比正则表达式方法更易于测试和增量。以下代码适用于哈希标记:

    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
        }
    }
如果要转换的hashtag列表变得很长,那么使用字典会更简洁,例如:

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

您应该使用
Uri
类来解析Uri,而不是regex。感谢您在这方面的帮助。我喜欢你用字典的方法。但是,我对如何将字典与
ReplaceHashTag
方法合并感到困惑,因为它们之间没有关系,它们与
Main
方法之间也没有关系。你能给我解释一下吗?我给你的例子是在一个控制台应用程序中写的。因为它的
Main
方法是静态的,所以我使
ReplaceHashTag
也是静态的。字典被声明为静态字段。
        if (!_hashtags.ContainsKey(hashtag))
        {
            return hashtag;
        }

        return _hashtags[hashtag];