簡體   English   中英

正則表達式字符串但有幾個選項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM