我目前正在尝试在管道分隔符上拆分一个字符串:
999|150|222|(123|145)|456|12,260|(10|10000)
Run Code Online (Sandbox Code Playgroud)
问题是我不想|
在括号内分开,我只想在括号外分割这个字符.
这只是分裂每个|
角色,产生我不想要的结果:
x <- '999|150|222|(123|145)|456|12,260|(10|10000)'
m <- strsplit(x, '\\|')
[[1]]
[1] "999" "150" "222" "(123" "145)" "456" "12,260" "(10"
[9] "10000)"
Run Code Online (Sandbox Code Playgroud)
我希望得到以下结果,保持括号内的所有内容:
[[1]]
[1] "999" "150" "222" "(123|145)" "456"
[6] "12,260" "(10|10000)"
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.
hwn*_*wnd 12
您可以PCRE
通过使用perl=T
和一些黑暗魔法打开:
x <- '999|150|222|(123|145)|456|12,260|(10|10000)'
strsplit(x, '\\([^)]*\\)(*SKIP)(*F)|\\|', perl=T)
# [[1]]
# [1] "999" "150" "222" "(123|145)" "456"
# [6] "12,260" "(10|10000)"
Run Code Online (Sandbox Code Playgroud)
我们的想法是跳过括号中的内容.现场演示
在交替运算符的左侧,我们匹配括号中的任何内容,使子模式失败并强制正则表达式引擎不使用回溯控制重试子字符串.交替运算符的右侧匹配|
(括号外,我们想要的......)
一种选择:
scan(text=gsub("\\(|\\)", "'", x), what='', sep="|")
#[1] "999" "150" "222" "123|145" "456" "12,260" "10|10000"
Run Code Online (Sandbox Code Playgroud)
这是另一种使用方式strsplit
.这里有其他答案strsplit
,但这似乎是最简单的模式:
strsplit(x, "\\|(?!\\d+\\))", perl=TRUE)
# [1] "999" "150" "222" "(123|145)" "456" "12,260" "(10|10000)"
Run Code Online (Sandbox Code Playgroud)