Regex.Split()将句子拆分为单词,同时保留空白

本文关键字:单词 空白 保留 拆分 Split 句子 Regex | 更新日期: 2023-09-27 18:15:11

我使用Regex.Split()来获取用户输入并将其转换为列表中的单个单词,但目前它删除了他们添加的任何空格,我希望它保留空白。

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

Regex.Split()将句子拆分为单词,同时保留空白

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+)

这意味着一系列空格需要在它或字符串的开始之前有一个非空格字符。

我猜您感兴趣的一些"单词"实际上是可以接受空格的短语。不能简单地将空格字符既用作短语分隔符,又用作短语本身中允许的字符。尝试使用逗号作为分隔符:

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+|,");