使用單詞邊界(\\b
)並指定環視兩個可能性:
unlist(strsplit("var==5", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" "==" "5"
unlist(strsplit("var<3", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" "<" "3"
unlist(strsplit("var>2", "(?=(\\b[^a-zA-Z0-9])|(\\b[a-zA-Z0-9]\\b))", perl = TRUE))
[1] "var" ">" "2"
說明:
拆分在「字」,結束時,之後,有或者是一個非字母數字字符\\b[^a-zA-Z0-9]
或它是「詞」和結束時,之後,有一個字母數字字符。
編輯:
實際上上面的代碼將具有意想不到的結果,如果在端部的數量爲10以上。
另一種選擇是使用lookbehind
和分裂時,前,有要麼非alphanum字符後跟一個字邊緣,或一個alphanum字符後跟一個字邊緣:
strsplit("var<20", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "<" "20"
strsplit("var==20", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "==" "20"
strsplit("var!=5", "(?<=(([^a-zA-Z0-9]\\b)|([a-zA-Z0-9]\\b)))", perl = TRUE)[[1]]
#[1] "var" "!=" "5"
EDIT2:
共竊取@Tensibai的方式來定義alphanum(+下劃線)/非alphanum字符,上述regex
可以簡化到:"(?<=((\\W\\b)|(\\w\\b)))"
你只想限制爲'''','<'和'=='嗎? –
@Wiktor,是的,我只想限制>,<和==的分割。也許也是!=。 – Daniel
順便說一句,你可以使用'sub(「(。*?)([= <>]。)(。*)」,「\\ 2」,「var == 55」,perl = TRUE)或類似的東西。你也可以用它來分割'strsplit(sub(「(。*?)([= <>]。)(。*)」,「\\ 1 \\ 2 \\ 3」,「var == 55」 ,perl = TRUE),「」)'但是Wiktors解決方案可能更好 –