2011-11-20 105 views
5

我使用Regex.Split()來接收用戶輸入並將它變成列表中的單個單詞,但此時它刪除了它們添加的任何空格,我希望它保留空白。Regex.Split()在保留空格的同時保留單詞

string[] newInput = Regex.Split(updatedLine, @"\s+"); 
+4

你想在哪裏保留空格?例如,「foo bar」應該分成多少個字符串? – BoltClock

回答

6
string text = "This   is some text"; 
var splits = Regex.Split(text, @"(?=(?<=[^\s])\s+)"); 

foreach (string item in splits) 
    Console.Write(item); 
Console.WriteLine(splits.Count()); 

這會給你4將每個擁有所有前導空格保存。

(?=\s+) 

從前面有空格的地方分裂出來的手段。但是,如果單獨使用它,它將在示例文本上創建15個分割,因爲在重複空格的情況下,每個空間都會緊跟另一個空格。

(?=(?<=[^\s])\s+) 

這意味着從它之前沒有空格字符的點開始拆分,並且它之前有空格。

如果文本從空白開始,你想,要在沒有文字第一次分裂被捕獲,那麼你可以修改表達式如下

(?=(?<=^|[^\s])\s+) 

這意味着一系列的空間需要有一個非空間在它之前的字符或字符串的開始。

+0

非常完美謝謝你 – Joel

+0

Goooooooooooooooooooooooooooood! +1 –

0

我猜你感興趣的一些「單詞」實際上是空格可接受的短語。您不能輕易將空格字符用作短語本身中的短語分隔符和允許的字符。嘗試使用逗號作爲分隔符,而不是:

string updatedLine = "user,input,two words,even three words"; 
string[] newInput = Regex.Split(updatedLine, @","); 

這正則表達式的版本允許逗號後面尾隨空格:

string updatedLine = "user, input, two words, even three words"; 
string[] newInput = Regex.Split(updatedLine, @",\s+|,");