我必须拆分一组丑陋而复杂的字符串:
const range = (a, b) =>
a > b
? []
: [ a, ...range(a + 1, b) ]
console.log(range(1, 5))
// [ 1, 2, 3, 4, 5 ]
console.log(range(3, 6))
// [ 3, 4, 5, 6 ]
console.log(range(9, 3))
// []
我需要在有空格(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'"
)的所有地方拆分字符串,除非空格在之间。因此,在上面的示例中,
'
将变成'01' '02'
和'01'
,而'02'
将变成#'autres 32' #'batiment 30'
和#'autres 32'
。
我曾尝试从this question那里获得灵感,但并没有走得很远:
#'batiment 30'
因为此解决方案可以拆分一些不应该使用的空间,并且使我也失去了一些信息。
拆分后的结果应类似于:
strsplit(vec, "(\\s[^']+?)('.*?'|$)")
分割此字符串的正确正则表达式是什么?
谢谢
答案 0 :(得分:5)
您可以使用
strsplit(vec, "'[^']*'(*SKIP)(*F)|\\s+", perl=TRUE)
在线查看R demo和regex demo。
详细信息
'[^']*'(*SKIP)(*F)
-'
,然后是'
以外的任何0+字符(请参阅[^']*
),然后是'
,然后将匹配的文本丢弃然后从当前匹配失败的位置开始搜索下一个匹配项(请参见(*SKIP)(*F)
)|
-或\s+
-1个以上的空格字符。由于它是PCRE模式,因此perl=TRUE
是必需的。