我觉得这很奇怪:
pattern <- "[[:punct:][:digit:][:space:]]+"
string <- "a . , > 1 b"
gsub(pattern, " ", string)
# [1] "a b"
library(stringr)
str_replace_all(string, pattern, " ")
# [1] "a > b"
str_replace_all(string, "[[:punct:][:digit:][:space:]>]+", " ")
# [1] "a b"
这是预期的吗?
答案 0 :(得分:7)
仍在努力,但是?"stringi-search-charclass"
说:
当心使用POSIX字符类,例如‘[:punct:]’。重症监护病房 用户指南(请参阅下文)指出,通常它们不是 定义明确,因此最终可能会与您有所不同 期待。
尤其是在类似POSIX的正则表达式引擎中,“ [:punct:]”代表 与“ ispunct()”相对应的字符类 分类功能(在类似UNIX的系统上检查“ man 3 ispunct” 系统)。根据ISO / IEC 9899:1990(ISO C90), “ ispunct()”功能测试除以下字符外的所有打印字符 空格或“ isalnum()”为真的字符。但是,在 POSIX设置,哪些字符属于哪个的详细信息 类取决于当前的语言环境。因此,“ [:punct:]”类 不会导致可移植代码(同样,在类似POSIX的正则表达式引擎中)。
因此POSIX风格的[[:punct:]]在其中更像是[[\ p {P} \ p {S}]] “ ICU”。您已被警告。
复制上面发布的问题,
string <- "a . , > 1 b"
mypunct <- "[[\\p{P}][\\p{S}]]"
stringr::str_remove_all(string, mypunct)
我会欣赏某些特定于语言环境的内容,但令我惊讶的是[:punct:]
甚至在C语言环境中都无法工作...