如何用正则表达式提取用户名?正则提取报对象引用未找到异常
解决从指定字符串提取用户名的问题
首先咱们先聊聊你遇到的Object reference not found异常为啥会出现:你的代码里用了LastOrDefault(),如果正则没找到任何匹配项,这个方法会返回null,这时候直接调用ToString()自然就触发空引用异常了。而且原正则匹配的是所有括号内的内容,拿到的会是@[Username]而不是纯用户名,也不符合你的需求。
接下来给你两个靠谱的解决方案:
方案一:精准匹配用户名的正则
咱们直接把正则写成专门捕获@后面用户名的形式,同时先判断匹配是否成功,避免空引用:
public string ExtractUsername(string title) { // 正则作用:匹配(@xxx)格式,精准捕获xxx部分的用户名 var regexMatch = Regex.Match(title, @"\(@([^)]+)\)"); // 先检查是否匹配成功,避免空引用 if (regexMatch.Success) { // Groups[1]就是我们捕获到的纯用户名部分 return regexMatch.Groups[1].Value; } // 没有匹配到的时候返回默认值,你可以根据需求改成null或者其他内容 return string.Empty; }
这个正则的细节拆解:
\(:转义左括号,因为括号在正则里是特殊字符,必须转义才能匹配字面量的(@:匹配字符串里的@符号([^)]+):这是一个捕获组,[^)]表示匹配除了右括号)之外的任意字符,+表示匹配至少一个字符,这样就精准拿到了@后面的用户名\):转义右括号,匹配字面量的)
方案二:更严谨的格式校验(可选)
如果担心输入字符串格式可能有偏差,还可以先确认整个字符串符合预期格式再提取,比如:
public string ExtractUsername(string title) { // 先匹配完整的<title>包裹格式,同时捕获用户名 var regexMatch = Regex.Match(title, @"<title>.*\(@([^)]+)\) on .*</title>"); if (regexMatch.Success) { return regexMatch.Groups[1].Value; } return string.Empty; }
这个正则会先确保整个字符串是<title>包裹的、包含on [Site]的格式,再提取用户名,适合对输入格式要求严格的场景。
最后提醒一句:处理正则匹配的时候,一定要先判断match.Success,避免因为没匹配到内容而触发空引用异常哦~
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

