我觉得这真的很奇怪:
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语言环境中工作,这仍然让我感到惊讶。。。