正则表达式字符串,但有几个选项



我的字符串:

string str = "user:steo id:1 nickname|user:kevo id:2 nickname:kevo200|user:noko id:3 nickname";

现在我想用正则表达式获取值:

var reg = Regex.Matches(str, @"user:(.+?)sid:(d+)s+nickname:(.+?)")
.Cast<Match>()
.Select(a => new
{
user = a.Groups[1].Value,
id = a.Groups[2].Value,
nickname = a.Groups[3].Value
})
.ToList();
foreach (var ca in reg)
{
Console.WriteLine($"{ca.user} id: {ca.id} nickname: {ca.nickname}");
}  

我不知道如何使用我可以使用的正则表达式来做到这一点nickname:(the nickname)我只想在昵称像nickname:kevo200和 nochnickname

我不是 100% 确定这是否回答了您的问题,但我通过正则表达式解析从给定的输入字符串中获取了一个列表,并在可用时返回昵称,否则返回用户名。

PS C:WINDOWSsystem32> scriptcs
> using System.Text.RegularExpressions;
> var regex = new Regex(@"|?(?:user(?::?(?<user>w+))sid(?::?(?<id>d*))s?nickname(?::?(?<nick>w+))?)");
> var matches = regex.Matches("user:steo id:1 nickname|user:kevo id:2 nickname:kevo200|user:noko id:3 nickname");
> matches.Cast<Match>().Select(m=>new {user=m.Groups["user"].Value,nick=m.Groups["nick"].Value}).Select(u=>string.IsNullOrWhiteSpace(u.nick)?u.user:u.nick);
[
"steo",
"kevo200",
"noko"
]

编辑:正则表达式设计器:https://regexr.com/3uf8t

编辑:改进版本以接受昵称中的转义序列

PS C:WINDOWSsystem32> scriptcs
> using System.Text.RegularExpressions;
> var regex = new Regex(@"|?(?:user(?::(?<user>w+))?sid(?::(?<id>d*))?s?nickname(?::(?<nick>[w\]+))?)");
> var matches = regex.Matches("user:steo id:1 nickname|user:kevo id:2 nickname:kevo200|user:noko id:3 nickname|user:kevo id:2 nickname:kev\so200");
> matches.Cast<Match>().Select(m=>new {user=m.Groups["user"].Value,nick=m.Groups["nick"].Value.Replace("\s"," ")}).Select(u=>string.IsNullOrWhiteSpace(u.nick)?u.user:u.nick);
[
"steo",
"kevo200",
"noko",
"kev o200"
]

试试这个user:(.+?)sid:(d+)s+nickname:*(.*?)(||$).

起初我提出了这个正则表达式:user:(.+?)sid:(d+)s+nickname:*(.*?)|*– 错误,由于懒惰的量词而没有捕获名称。

然后这个正则表达式:user:(.+?)sid:(d+)s+nickname(:(.+?)|)(||$)– 这应该匹配字符串中除以"|"的所有部分,并为空昵称提供 nickname="。但是,如果未定义Groups[4](当昵称后面没有":"时(,则需要检查值是否存在。

如果由我决定,并且您正在处理的数据始终是管道分离的,并且顺序恒定,我可能会跳过正则表达式并使用 String.Split 将字符串拆分为它的片段,就像这样。

string str = "user:steo id:1 nickname|user:kevo id:2 nickname:kevo200|user:noko id:3 nickname";
var entries = str.Split('|');
foreach(var entry in entries)
{
var subs = entry.Split(' ');
var userName = subs[0].Split(':')[1];
var id = subs[1].Split(':')[1];
var tempNick = subs[2].Split(':');
var nick = tempNick.Length == 2 ? tempNick[1] : string.Empty;
Console.WriteLine(userName + " id:" + id + " nickname " + nick);
}

没有正则表达式:

static void GetInfo()
{
string input = @"user:steo id:1 nickname|user:kevo id:2 nickname:kevo200|user:noko id:3 nickname";
var users =
from info in input.Split('|')
let x = info.Split(" ")
let nick_split = x[2].Split(':')
let has_nick = nick_split.GetUpperBound(0) > 0
let z = new
{
User = x[0].Split(':')[1],
Id = x[1].Split(':')[1],
Nickname = has_nick ? nick_split[1] : String.Empty
}
select z;
foreach (var user in users)
{
Console.WriteLine($"user: {user.User}, id: {user.Id}, nickname: {user.Nickname}");
}
}

最新更新