Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
stringr是否为标点符号使用了一组不同的字符类?_R_Regex_Stringr_Grepl - Fatal编程技术网

stringr是否为标点符号使用了一组不同的字符类?

stringr是否为标点符号使用了一组不同的字符类?,r,regex,stringr,grepl,R,Regex,Stringr,Grepl,我使用的是[:punct:]正则表达式字符类,在我看来,stringr包并没有像基本grep那样定义[:punct:] stringr和grep通常同意一些基本标点符号,包括,和: 但不适用于诸如`、~和|等其他人,也可能适用于其他人。下面是对[:punct:]的更全面的测试,尽管我还没有测试过其他角色类。不确定这是否仅限于[:punct:] 图书馆长 点我不知道为什么,但我们可以探索差异的传播程度。我们可以生成一组覆盖正常拉丁语范围的字符 rawToChar(as.raw(33:126)) #

我使用的是[:punct:]正则表达式字符类,在我看来,stringr包并没有像基本grep那样定义[:punct:]

stringr和grep通常同意一些基本标点符号,包括,和:

但不适用于诸如`、~和|等其他人,也可能适用于其他人。下面是对[:punct:]的更全面的测试,尽管我还没有测试过其他角色类。不确定这是否仅限于[:punct:]

图书馆长 点我不知道为什么,但我们可以探索差异的传播程度。我们可以生成一组覆盖正常拉丁语范围的字符

rawToChar(as.raw(33:126))
#> [1] "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
所以有9个标点符号是grepl检测到的,而stringr没有。stringr没有检测到grepl没有的标点符号。切换perl=TRUE对结果没有影响

您发现的案例似乎被解释为regex,但检测到[]-的事实证明了这一点。

可能只是str_detect将^视为regex。如果你用str_探测“^HELLO”,就会产生“[:punct:]”true@camille如果你运行str_extract_all“^HELLO”,“[:punct:]”你会得到\-它检测到的是转义的\,而不是^stringr在引擎盖下运行stringi,我认为stringi使用的正则表达式库与base R不同。stringi使用的是base R,但我对regex知之甚少,所以我不会相信我的话。
> grepl('[[:punct:]]', '?HELLO')
[1] TRUE
> str_detect('?HELLO', '[[:punct:]]')
[1] TRUE
rawToChar(as.raw(33:126))
#> [1] "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
testCase = strsplit(rawToChar(as.raw(33:126)),'')[[1]]
base = sapply(testCase,grepl,pattern="[[:punct:]]")
stringr = sapply(testCase,stringr::str_detect,pattern="[[:punct:]]")

base_punct = names(base)[base]
stringr_punct = names(stringr)[stringr]

setdiff(base_punct,stringr_punct)
#> [1] "$" "+" "<" "=" ">" "^" "`" "|" "~"
setdiff(stringr_punct,base_punct)
#> character(0)