在使用`stringr :: str_replace_all`时,“>”与“ [[:punct:]]”不匹配?

时间:2018-11-02 13:51:54

标签: r regex stringr

我觉得这很奇怪:

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"

这是预期的吗?

1 个答案:

答案 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语言环境中都无法工作...