我有简单的模式:\s+
来分割空格:
string temp="str1 str2 str3 ";
string pattern=@"\s+";
var tempArr=Regex.Split(temp,pattern);
因此,结果为str1
,str2
,str3
。
但是,我需要为每个单词保留一个空格(如果存在):
'str1',' ','str2',' ','str3'.
我可以使用Regex.Split
执行此操作,还是应该使用其他方式?
答案 0 :(得分:3)
而不是在空白处拆分,捕获:
(\S+)
(\s+(?=\S))
(使用zero-width positive lookahead assertion)然后将仅包含空格的匹配转换为单个空格:
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();
答案 1 :(得分:2)
Regex.Split将删除任何匹配的分割模式,并返回数组中的剩余内容,因此它不会拥有空白本身的数组条目。您可以根据需要循环并复制带有添加空格的数组,或者将其打印出来。
但是,如果您真的希望输出为带有&#39;的数组。 &#39;作为条目的空格,您可以先用一些任意序列替换所有空格,例如&#34;&lt;#&gt; &LT;#&GT;&#34;然后Regex.Split on&#34;&lt;#&gt;&#34;。这会给你指定的数组。但是,您需要注意任意序列在真实字符串中不会有效,或者您必须进行前后编码/解码,从而无法做到这一切。
http://www.regular-expressions.info/lookaround.html 第三种选择是使用后视/前瞻。用3个空格替换所有空白区域&#39; &#39;然后,您的Regex.Split匹配所有前面都有非空格的空格字符,所有空格字符后跟非空格,使用正则表达式或|符号,匹配任何一种类型。然后,三个空格的第一个和最后一个空格将是分裂,中间的空格将被预先设定,这可以在一个Regex.Replace和一个Regex.Split中完成。
'\s(?!\s)'
使用负向前瞻来匹配空格后面没有空格,而
'(?<!\s)\s'
使用lookbehind匹配不在空格前面的空格。将其与|或你得到了
Regex.Replace("\s+","\s\s\s")
Regex.Split("(?<!\s)\s|\s(?!\s)")
显然,确切的细节可能会有所不同,具体取决于你的正则表达式的风格,因为其中一些有不同的解释,并且可能不支持所有相同的命令。
答案 2 :(得分:1)
您可以在将输入字符串传递给Regex.Split
时修剪输入字符串,并使用与您的输入字符串几乎完全相同的模式 - (\s)+
。将捕获组添加到与Regex.Split
一起使用的模式会强制引擎将捕获的内容与结果数组中的其他不匹配块一起输出:
如果在Regex.Split表达式中使用捕获括号,则任何捕获的文本都包含在结果字符串数组中。例如,如果在捕获括号内的连字符上拆分字符串“plum-pear”,则返回的数组包含一个包含连字符的字符串元素。
(\s)+
模式将找到所有1个以上的空格,但只会将1个单个空格捕获到组内存缓冲区中,从而只将这一个空格添加到最终结果数组中:
var temp="str1 str2 str3 ";
var pattern=@"(\s)+";
var tempArr=Regex.Split(temp.Trim(),pattern);
Console.WriteLine("'{0}'", string.Join("','", tempArr));
// => 'str1',' ','str2',' ','str3'
请参阅C# demo