2017-02-13 45 views
1

我有简单的图案:\s+分裂空格:Can Regex.Split可以得到多个空格吗?

string temp="str1 str2 str3 "; 
string [email protected]"\s+"; 
var tempArr=Regex.Split(temp,pattern); 

所以,结果是str1str2str3。 但是,我需要保持每字一个空格(如果存在的话):

'str1',' ','str2',' ','str3'. 

我可以做到这一点Regex.Split,或者我应该用另一种方式?

+1

最后的空白怎么样? –

+0

@PranavCBalan,它应该会丢失。 –

回答

3

而不是空格分裂,捕获:

然后将仅包含空格的匹配转换为单个空格:

Regex regx = new Regex(@"(\S+)|(\s+(?=\S))"); 
var matches = regx.Matches(myString); 

var values = matches.OfType<Match>().Select(m => String.IsNullOrWhiteSpace(m.Value) ? " " : m.Value).ToArray(); 
2

Regex.Split会删除任何匹配的分割模式,并返回数组中的其余内容,所以它不会有空白本身的数组条目。您可以根据需要循环并复制带有添加空格的阵列,或者将其打印出来。

但是,如果你真的想要的输出与'空间作为条目的数组,你可以先用“<一些任意序列,如“<#> <#>”,然后Regex.Split替换所有空白#>”。这会给你你指定的数组。但是,你需要小心的是,任意序列在真正的字符串中不会是有效的发生,否则你必须进行前后编码/解码,否则就无法完成所有这些工作。

http://www.regular-expressions.info/lookaround.html 第三种选择是使用后视/前视。将所有空格替换为3个空格'',然后,您的Regex.Split将使用正则表达式或|空格来匹配所有以非空格开头的空格字符,并且所有空格字符后跟非空格。符号,以匹配任何一种类型。然后,三个空格的第一个和最后一个空格将是分割,中间的分割将被预先保存,这可以在一个Regex.Replace和一个Regex.Split中完成。

'\s(?!\s)' 

使用负先行以匹配不后跟一个空格的空间中,而

'(?<!\s)\s' 

使用回顾后以匹配不是由前面的空间的空间。把它放在一起或|你

Regex.Replace("\s+","\s\s\s") 
Regex.Split("(?<!\s)\s|\s(?!\s)") 

显然,具体细节可能会根据您的正则表达式的味道,因为他们中的一些有不同的解释各不相同,可能不支持相同的命令。

1

当您将输入字符串传递到Regex.Split时,您可能会修剪您的输入字符串,并使用与您的图案几乎相同的图案 - (\s)+

如果捕获括号在一个Regex.Split表达所使用的,任何捕获文本是:与所得阵列中的其它非匹配块添加一个捕获组与Regex.Split使用的模式强制发动机输出的拍摄内容一起包含在结果字符串数组中。例如,如果将字符串“plum-pear”拆分为捕获圆括号内的连字符,则返回的数组将包含一个包含连字符的字符串元素。

(\s)+的图案会发现所有1+空格,但只捕获1个单个空格到该组存储器缓冲器从而增加只有这一个空白到最终得到的数组:

var temp="str1 str2 str3 "; 
var [email protected]"(\s)+"; 
var tempArr=Regex.Split(temp.Trim(),pattern); 
Console.WriteLine("'{0}'", string.Join("','", tempArr)); 
// => 'str1',' ','str2',' ','str3' 

C# demo

相关问题