Regex.Split()函数将句子分割成单词并保留空格

5
我正在使用Regex.Split()将用户输入转换为列表中的单独单词,但是目前它会删除任何添加的空格,我希望它可以保留空格。
string[] newInput = Regex.Split(updatedLine, @"\s+");

4
你希望在哪里保留空格?例如,字符串 " foo bar " 应该分割成什么样子? - BoltClock
2个回答

8
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
我猜你感兴趣的一些“单词”实际上是可以接受空格的短语。你不能轻易地将空格字符同时用作短语分隔符和短语本身内可接受的字符。尝试使用逗号作为分隔符代替:
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+|,");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接