我有以下内容:
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
> fish
,good
@fish and fries and @Mary's beer are @good
> fish
,good
,marys
渴望输入>输出
@fish and fries are @good
> fish
,good
@fish and fries and @Mary's beer are @good
> fish
,good
, Mary
这里的关键是删除任何违规字符后的内容。如何实现这一目标?
答案 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字母,数字,-
和_
符号。