使用单词边界(\\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解决方案可能更好 –