如何在非传统的白色空间上拆分字符串?

时间:2017-02-09 21:45:38

标签: ruby regex tabs whitespace

Ruby 2.4。我希望通过多个空格分割一条线,即多个单个断开或不间断的空间,或者不是单个空格的空白区域(如制表符或新行)。我尝试了下面的

tokens_by_spaces = line.split(/\s\s+/)

但这失败了。例如,如果行是

"A B\tC D"

以上返回

["A B\tC D"]

而我希望它返回

["A B", "C D"]

同样,如果我的行是

"ab c  def g"

我希望结果是

["ab c", "def g"]

1 个答案:

答案 0 :(得分:2)

我建议使用

/[ \u00A0]*(?:[[:space:]&&[^ \u00A0]][ \u00A0]*)+|[[:space:]]{2,}/

请参阅regex demo

虽然\s似乎可以匹配任何Unicode空白,如果模式前缀为(?u)[[:space:]]似乎是一种更常用的方式来匹配任何Unicode空格。

<强>详情:

该模式有2个与...匹配的分支。

  • [ \u00A0]*(?:[[:space:]&&[^ \u00A0]][ \u00A0]*)+ - 一大块包含至少1个非空格/非空间空格的空格
    • [ \u00A0]* - 零次或多次出现常规或不间断的空格
    • (?:[[:space:]&&[^ \u00A0]][ \u00A0]*)+ - 一次或多次出现:
      • [[:space:]&&[^ \u00A0]] - (字符类减法)除常规/不间断空格外的任何空格
      • [ \u00A0]* - 零个或多个常规/非破坏空格
  • | - 或
  • [[:space:]]{2,} - 2个或更多任何空格符号