r-">"不匹配";[[:标点符号:]]";使用`stringr::str_



我觉得这真的很奇怪:

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"

这是意料之中的事吗?

仍在努力,但?"stringi-search-charclass"表示:

小心使用POSIX字符类,例如"[:punct:]"。ICU《用户指南》(见下文(指出,一般来说定义明确,所以可能会得到与你不同的东西预料

特别是,在类似POSIX的正则表达式引擎中,"[:punct:]"代表与"ispunct(("对应的字符类分类函数(在类UNIX上检查"man 3 ispunct"系统(。根据ISO/IEC 9899:1990(ISO C90("ispunct(("函数测试除空格或"isalnum(("为true的字符。然而,在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语言环境中工作,这仍然让我感到惊讶。。。

最新更新