簡體   English   中英

在 .NET 中使用正則表達式拆分字符串

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

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