我是一名新的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;
}
答案 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];