我有以下内容:
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);
}
电流输入 > 输出
@fish 和薯条是@good
>fish
,good
@fish and fries 和@Mary's beer 都是@good
>fish
,good
,marys
<
期望的输入 > 输出
@fish 和薯条是@good
>fish
,good
@fish and fries 和@Mary's beer 都是@good
>fish
,good
,Mary
此处的关键是删除违规字符之后的所有内容。如何实现?
最佳答案
你用空格分割一个字符串,检查一个 block 是否以@
开头, 然后如果是,删除所有 @
字符串中的符号,然后使用正则表达式删除所有非字母数字,-
和 _
字符串中的字符,然后将其添加到列表中。
你可以用一个正则表达式来做到这一点:
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 字母、数字、-
和_
符号。
关于c# - 正则表达式获取以@开头的所有内容并删除所有未包含字符之后的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43334308/