在空格处拆分 R 字符串,但当空格在单引号之间时不拆分

Bas*_*ien 3 regex r

我有一组丑陋而复杂的字符串,我必须拆分:

vec <- c("'01'", "'01' '02'", 
         "#bateau", "#bateau #batiment",
         "#'autres 32'", "#'autres 32' #'batiment 30'", "#'autres 32' #'batiment 30' #'contenu 31'",
         "#'34'", "#'34' #'33' #'35'")
vec
[1] "'01'"                                      "'01' '02'"                                
[3] "#bateau"                                   "#bateau #batiment"                        
[5] "#'autres 32'"                              "#'autres 32' #'batiment 30'"              
[7] "#'autres 32' #'batiment 30' #'contenu 31'" "#'34'"                                    
[9] "#'34' #'33' #'35'" 
Run Code Online (Sandbox Code Playgroud)

我需要在有空格 ( ) 的任何地方拆分字符串,除非空格在'. 所以在上面的例子中,'01' '02'会变成'01''02'#'autres 32' #'batiment 30'会变成#'autres 32'#'batiment 30'

我试过从这个问题中获得灵感,但没走多远:

strsplit(vec, "(\\s[^']+?)('.*?'|$)")
Run Code Online (Sandbox Code Playgroud)

因为这个解决方案分裂了一些不应该的空间,让我也失去了一些信息。

拆分的结果应该是这样的:

res <- c("'01'", "'01'", "'02'", 
         "#bateau", "#bateau", "#batiment",
         "#'autres 32'", "#'autres 32'", "#'batiment 30'", "#'autres 32'", "#'batiment 30'", "#'contenu 31'",
         "#'34'", "#'34'", "#'33'", "#'35'")
Run Code Online (Sandbox Code Playgroud)

拆分此字符串的正确正则表达式是什么?

谢谢

Wik*_*żew 5

您可以使用

strsplit(vec, "'[^']*'(*SKIP)(*F)|\\s+", perl=TRUE)
Run Code Online (Sandbox Code Playgroud)

在线查看R 演示正则表达式演示

细节

  • '[^']*'(*SKIP)(*F)- ', 然后是除'(see [^']*) 和 then之外的任何 0+ 字符',然后丢弃此匹配的文本,并从当前匹配失败的位置搜索下一个匹配 (参见(*SKIP)(*F))
  • | - 或者
  • \s+ - 1+ 个空白字符。

由于它是 PCRE 模式,因此perl=TRUE是强制性的。