正则表达式以@开头的所有内容并删除任何未包含的字符之后的所有内容

时间:2017-04-10 23:15:07

标签: c# regex

我有以下内容:

        Regex RgxUrl = new Regex("[^a-zA-Z0-9-_]");
        foreach (var item in source.Split(' ').Where(s => s.StartsWith("@")))
        {
            var mention = item.Replace("@", "");
            mention = RgxUrl.Replace(mention, "");
            usernames.Add(mention);
        }

CURRENT INPUT>输出

  • @fish and fries are @good> fishgood
  • @fish and fries and @Mary's beer are @good> fishgoodmarys

渴望输入>输出

  • @fish and fries are @good> fishgood
  • @fish and fries and @Mary's beer are @good> fishgood Mary

这里的关键是删除任何违规字符后的内容。如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

使用空格分割字符串,检查块是否以@开头,如果是,则删除字符串中的所有@符号,然后使用正则表达式删除所有非字母数字,字符串中的-_个字符,然后将其添加到列表中。

你可以用一个正则表达式来做到这一点:

var res = Regex.Matches(source, @"(?<!\S)@([a-zA-Z0-9-_]+)")
    .Cast<Match>()
    .Select(m=>m.Groups[1].Value)
    .ToList();
Console.WriteLine(string.Join("; ", res)); // demo
usernames.AddRange(res); // in your code

请参阅C# demo

模式详情

  • (?<!\S) - 当前位置的左边不能有非空格符号(即必须有空格或字符串的开头)(这种后观是因为原始代码拆分了字符串用空格)
  • @ - 一个@符号(它不是后续组的一部分,因为此符号已在原始代码中删除)
  • ([a-zA-Z0-9-_]+) - 捕获第1组(使用m.Groups[1].Value访问),匹配一个或多个ASCII字母,数字,-_符号。