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