[英]Regex string but with several options
我的字符串:
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:(the nickname)
我只想使用昵稱,如果它有像nickname:kevo200
這樣的nickname:kevo200
和 noch nickname
我不是 100% 確定這是否能回答您的問題,但我通過正則表達式解析從給定的輸入字符串中獲取了一個列表,並在可用時返回昵稱,否則返回用戶名。
PS C:\WINDOWS\system32> 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:\WINDOWS\system32> 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(:(.+?)|)(\\||$)
– 這應該匹配所有被“|”分割的部分在您的字符串中,並為空昵稱提供昵稱 =“”。 但如果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}");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.