如何在列表中存储与主题标签匹配的每个正则表达式?

时间:2019-06-10 11:08:37

标签: c# regex

遍历正则表达式的匹配结果时,我创建了一个新的hashtag对象并将其保存到列表中。

问题是,如果我有4个#hashtags,则它的最后一个hashtag被记录4次。例如-#这个#是#一些#标签。 #hashtags将在我的列表中记录4次。如何获得所有正确标记在列表中的主题标签?

List<Hashtag> hashTags = new List<Hashtag>();
                        var hashTag = new Hashtag();

                        Regex expression = new Regex(@"([#][a-zA-Z0-9]{1})\w*");
                        var results = expression.Matches(model.Caption);
                        foreach (Match match in results)
                        {
                            hashTag.CreatedOn = DateTime.UtcNow;
                            hashTag.Id = Guid.NewGuid();
                            hashTag.Text = match.ToString();

                            hashTags.Add(hashTag);
                        }

                        db.Hashtags.AddRange(hashTags);
                        await db.SaveChangesAsync();

我的列表hashTag应该包含匹配结果中的每个单独的hashtag。

3 个答案:

答案 0 :(得分:1)

您需要将var hashTag = new Hashtag();行放在foreach循环内。

答案 1 :(得分:0)

List<Hashtag> hashTags = new List<Hashtag>();
// var hashTag = new Hashtag(); remove this line move it to inside foreach

Regex expression = new Regex(@"([#][a-zA-Z0-9]{1})\w*");
var results = expression.Matches(model.Caption);
foreach (Match match in results)
{
   /*Keep it here so every time a new instance of Hashtag will be created and cached in your hasTags list,
  instead of updating same reference and adding it again, which causes your issue */
  var hashTag = new Hashtag();
  hashTag.CreatedOn = DateTime.UtcNow;
  hashTag.Id = Guid.NewGuid();
  hashTag.Text = match.ToString();

  hashTags.Add(hashTag);
}

db.Hashtags.AddRange(hashTags);
await db.SaveChangesAsync();

答案 2 :(得分:0)

在创建HashTag实例之前,请删除所有重复项:

string data = "#this #is #some #hashtags. #hashtags";

var tags = 
Regex.Matches(data, @"#([^\W]+)")
     .OfType<Match>()
     .Select(m => m.Groups[1].Value)
     .Distinct()
     .ToList();

哪个返回如下列表:

enter image description here

因此,一旦理解了该概念,就可以使用Select Linq扩展名(,因为它“投影”到了新的东西而被视为“投影”)实际上返回了{{1 }},甚至不需要List<HashTag>循环,例如

for

如下所示:

enter image description here


这是根据我的回答

How to Remove Duplicate Matches in a MatchCollection