如何使用正则表达式拆分字符串并包含空格

Posted

技术标签:

【中文标题】如何使用正则表达式拆分字符串并包含空格【英文标题】:How to use Regex to split a string AND include whitespace 【发布时间】:2015-03-23 13:59:11 【问题描述】:

我似乎找不到(或编写)将以下句子拆分为单词并将单词分配给字母之间的空白的简单方法。 (VS 2010,C#,.net4.0)。

String text = "This is a test.";

Desired result: 
[0] = This
[1] = " "
[2] = is
[3] = " "
[4] = a
[5] = " "
[6] = test.

我最接近的是:

  string[] words = Regex.Split(text, @"\s");

当然,这会去掉空格。

欢迎提出建议。谢谢

编辑:单词之间可能有一个或多个空格。我希望单词之间的所有空格都作为“单词”本身返回(所有空格都放在该“单词”中)。例如,如果一个单词之间有 5 个空格。

字符串空格=“”;

【问题讨论】:

是否总是有单个空格? @AmitJoki 没有。单词之间可能有多个空格。谢谢 @AlanWayne 那么结果应该是什么?要删除额外的空格吗? 最好把它放在问题中。 Relevant answer 【参考方案1】:

将您的模式更改为(\s+)

        String text = "This        is a   test.";
        string[] words = Regex.Split(text, @"(\s+)");
        for(int i =0; i < words.Length;i++)
        
            Console.WriteLine(i.ToString() + "," + words[i].Length.ToString() + " = " + words[i]);
        

这是输出:

0,4 = This
1,8 =         
2,2 = is
3,1 =  
4,1 = a
5,3 =    
6,5 = test.

【讨论】:

我之前试过,这会去掉单词之间的空格。 试试我的具体例子,看看上面编辑中的输出。如果您得到不同的结果,请向我们提供具体信息。 就是这样。添加 (...) 有何不同?谢谢。 括号使它成为captured group,这意味着它将保留:“除了将正则表达式的一部分分组在一起之外,括号还创建一个编号的捕获组。它存储匹配的字符串部分括号内的正则表达式部分。” 在 MSDN 中也是 here 的 Regex.Split():“如果在 Regex.Split 表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。”跨度> 【参考方案2】:

您可以使用LINQ在它们之间手动添加空格:

var parts = text.Split(new[] ' ' , StringSplitOptions.RemoveEmptyEntries);
var result = parts.SelectMany((x,idx) => idx != parts.Length - 1 
                                         ? new[]  x, " " 
                                         : new[]  x ).ToList();

【讨论】:

那么正则表达式会是什么? 该问题专门要求使用正则表达式,然后,无论多么有用,您的答案都不适合它。 @Kilazu 这不是它的工作原理。这不是任何 SO 的工作方式。 @Kilazur 只要答案解决了 OP 的问题,您就可以发布您认为最好使用的任何解决方案/解决方法 @Selman22 是的。有用!使用正则表达式如何做到这一点?谢谢。【参考方案3】:

你可以试试这个正则表达式\w+|\s+,它使用或运算符|

var arr = Regex.Matches(text, @"\S+|\s+").Cast<Match>()
                                         .Select(i => i.Value)
                                         .ToArray();

它只匹配单词和空格,并且使用了一些 LINQ 的东西,所以 arr 只是一个 String Array

【讨论】:

所以...不要使用 Regex.Split? 这几乎是完美的。有一个问题,单词可能包含“/”,即单词可能是“w/o”。上面的正则表达式在“/”字符上分割单词。想法??

以上是关于如何使用正则表达式拆分字符串并包含空格的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式拆分但如果拆分失败则包含空字符串

正则表达式在空格上拆分,除非在引号中

正则表达式拆分字符串,不包括可转义引号之间的分隔符

根据正则表达式拆分字符串

用于根据空格分隔符拆分文本的正则表达式 [重复]

用于拆分包含逗号的字符串的正则表达式