使用正则表达式提取用户名?

时间:2018-04-28 10:20:15

标签: c# .net regex

从此字符串中提取用户名?

<title>[FirstName] [SecondName] (@[Username]) on [Site]</title>

我尝试使用正则表达式,但它给了我:

  

找不到对象引用异常。

这是我使用的代码:

return Regex.Matches(title, @"\(([^)]*)\)").OfType<Match>().LastOrDefault().ToString();

3 个答案:

答案 0 :(得分:1)

请尝试以下操作:

            string input = "<title>[FirstName] [SecondName] (@[Username]) on [Site]</title>";

            string pattern = @"\[(?'value'[^\]]+)\]";

            MatchCollection matches = Regex.Matches(input, pattern);

            Console.WriteLine("User Name : '{0}'", matches[2].Groups["value"].Value);
            Console.ReadLine();

答案 1 :(得分:1)

如果您要从Username中提取<title>[FirstName] [SecondName] (@[Username]) on [Site]</title>,可以使用匹配的否定character class在组中捕获(@[])之间的内容不是关闭方括号一次或多次[^]+

\(@\[([^\]]+)\]\)

Demo

或者使用肯定的lookbehind断言左边的内容是(@[,并且肯定右边的内容是])的正向前瞻:

(?<=\(@\[)[^]]+(?=\]\))

Demo

答案 2 :(得分:0)

我刚刚测试了代码here并且它有效:

var match = Regex.Matches("<title>[FirstName] [SecondName] (@[Username]) on [Site]</title>", @"\(([^)]*)\)")
                 .OfType<Match>()
                 .LastOrDefault()
                 .ToString();

与您的代码唯一不同的是我没有使用title变量。因此,title变量可能是null,或者为空或不包含任何匹配项,因此您可能会因为LastOrDefault().ToString();失败而导致ToString()失败,因为您正在调用{{1} null引用时LastOrDefault返回null,当您处理空的引用类型集合时)。

要修复错误,只需重构您的代码,如下所示:

var match = Regex.Matches("<title>[FirstName] [SecondName] (@[Username]) on [Site]</title>", @"\(([^)]*)\)")
                 .OfType<Match>()?
                 .LastOrDefault()?
                 .ToString();

仅当结果不是?时才会调用null字符后面的代码。