[英]Splitting a string with regular expressions in .NET
當我在 .NET 中執行 RegEx.Split() 時,我需要一個正則表達式來檢查字符串並返回特定項目。 我一直在嘗試自己做這件事,但我似乎永遠無法得到我需要的東西,結果也沒有任何意義。 顯然我沒有很好地處理編寫正則表達式。
所以這里是字符串...
"%date - %-5level - [%thread] - %logger - %message - %exception%newline"
我本質上想要返回一個如下所示的數組:
"date"
"-5level"
"thread"
"logger"
"message"
"exception"
"newline"
以下代碼很接近,但並不完全。
Regex exp = new Regex(@"\W+");
string[] s = exp.Split(@"%date - %-5level - [%thread] - %logger - %message - %exception%newline");
我得到以下信息:
""
"date"
"5level"
"thread"
"logger"
"message"
"exception"
"newline"
出於某種原因,我有一個空字符串作為第一個索引,而第三個索引缺少“-”。 我假設是因為它不是“單詞”的一部分。
暫時將“-”放在一邊,然后我想將“5level”拆分為一個數組:
"5"
"level"
我對此進行了實驗:
Regex exp2 = new Regex(@"(\d+)([a-zA-Z]+)");
string[] s2 = exp2.Split("5level");
但是,除了我想要的拆分項之外,它還返回 2 個帶有空字符串的索引:
""
"5"
"level"
""
我對如何格式化表達式以提供我需要的東西感到困惑。 任何幫助,將不勝感激。
而不是使用Regex.Split
,匹配您需要的標記可能更容易:
MatchCollection matches = Regex.Matches(s, @"%([\w\-]+)");
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
正如您所見,Split 可能會添加空匹配項,這些匹配項必須被過濾掉。
更好的方法是使用RegEx引擎中的Named Capturing Groups
並過濾掉Linq
查詢中的任何空匹配項。
MatchCollection matches = Regex.Matches(s, @"%(?<SomeName>[\w\-]+)");
string[] words = matches.Cast<Match>().Where(m => m.Length > 0 ).Select(m => m.Groups["SomeName"].Value).ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.