【问题标题】:Can Regex.Split get multiple whitespaces?Regex.Split 可以得到多个空格吗?
【发布时间】:2017-02-13 06:42:12
【问题描述】:

我有简单的模式:\s+ 来分割空格:

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

所以,结果是str1,str2,str3。 但是,我需要为每个单词保留一个空格(如果存在):

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

我可以用Regex.Split 做到这一点,还是应该使用其他方式?

【问题讨论】:

  • 最后的空格呢?
  • @PranavCBalan,它应该不见了。

标签: c# regex split


【解决方案1】:

而不是在空格处拆分,捕获:

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

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 on "”。这会给你指定的数组。但是,您需要注意任意序列在真实字符串中永远不会有效出现,否则您必须进行编码/解码前后的处理,从而违背了这样做的目的。

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

    '\s(?!\s)'
    

    使用负前瞻来匹配没有空格的空格,而

    '(?<!\s)\s'
    

    使用lookbehind 匹配前面没有空格的空格。把它和 or | 放在一起你得到

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

    显然,确切的细节可能会因您的 Regex 风格而异,因为其中一些具有不同的解释,并且可能不支持所有相同的命令。

    【讨论】:

      【解决方案3】:

      您可以在将输入字符串传递给 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多