2016-09-27 267 views
3

我有以下字符串:分割字符串括號

x <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554" 
# [1] "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554" 

,我想通過空間分隔,避免括號內什麼,纔能有類似分裂它:

[[1]] 
[1] "(((K05708+K05709+K05710 K00529) K05711),K05712)"     
[2] "K05713"       "K05714"       
[4] "K02554" 

看到兩個空格保留在第一個括號內。提前 r split on delimiter not in parenthesesUsing strsplit() in R, ignoring anything in parentheses

感謝:

我閱讀下面的答案,但我不能讓它在我的情況下工作!

+0

看起來像你的字符串嵌套了平衡'()',你需要跳過裏面*平衡*括號中的空間,對不對? –

+0

是的!你是對的。 – IgnacioF

+0

每行上的最後一個括號是否總是標記第一個字段的結尾?已知的字段數(這裏是4)? –

回答

3

我認爲你需要一個正則表達式匹配平衡的括號,然後跳過它們,然後匹配留在下列基於PCRE正則表達式的空格:

(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|\s 

regex demo(與\s更換空間以上更好的可見度)。

圖案的詳細資料

  • (\((?:[^()]++|(?1))*\))(*SKIP)(*F) - 第1組匹配
    • \((?:[^()]++|(?1))*\) - 一個子呈現平衡括號子:\(匹配((?:[^()]++|(?1))*匹配零個或多個(*)的序列除了()(見[^()]++)以外的1+字符或整個組的整個模式1(見subrouting呼叫(?1)),然後\)匹配的文字)(*SKIP)(*F)使正則表達式放棄整個匹配的文本,同時保持正則表達式指數在那場比賽結束,並繼續尋找下一個比賽
  • | - 或
  • - 分裂針對

這裏的空間是一個online R demo

s <- "(((K05708+K05709+K05710+K00529) K05711),K05712) K05713 K05714 K02554" 
strsplit(s, "(\\((?:[^()]++|(?1))*\\))(*SKIP)(*F)| ", perl=TRUE) 

輸出:

[[1]] 
[1] "(((K05708+K05709+K05710+K00529) K05711),K05712)" 
[2] "K05713"           
[3] "K05714"           
[4] "K02554" 
+0

謝謝!它似乎工作正常。你能解釋一下你使用的正則表達式嗎? – IgnacioF

+0

請檢查我的答案。如果解釋不夠,請參閱[Regex遞歸](http://www.regular-expressions.info/recurse。html)和[Subroutines](http://www.regular-expressions.info/subroutine.html)。此外,請參閱[如何(* SKIP)或(* F)在正則表達式上工作?](http://stackoverflow.com/questions/24534782/how-do-skip-or-f-work-on-regex)。 –

相關問題