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
Regex R正则表达式:包含NAs的字符向量问题_Regex_R - Fatal编程技术网

Regex R正则表达式:包含NAs的字符向量问题

Regex R正则表达式:包含NAs的字符向量问题,regex,r,Regex,R,我试图使用gsub(),将向量元素中的所有多个(2个或更多)空格字符折叠为一个空格字符,例如: x1 <- c(" abc", "a b c ", "a b c") gsub("\\s{2,}", " ", x1) [1] " abc" "a b c " "a b c" 但是,如果使用类似Perl的正则表达式,则效果很好: gsub("\\s{2,}", " ", x2, perl = TRUE) [1] NA " abc" "a b c " "a b c"

我试图使用
gsub()
,将向量元素中的所有多个(2个或更多)空格字符折叠为一个空格字符,例如:

x1 <- c("  abc", "a b c    ", "a  b c")
gsub("\\s{2,}", " ", x1)
[1] " abc"   "a b c " "a b c"
但是,如果使用类似Perl的正则表达式,则效果很好:

gsub("\\s{2,}", " ", x2, perl = TRUE)
[1] NA       " abc"   "a b c " "a b c"

有人对R自己的正则表达式为什么会这样做有什么建议吗?如果有帮助的话,我将在Linux x86-64上使用R3.1.1。

我没有提到源代码,但是如果使用
useBytes=TRUE
参数(没有
perl=TRUE
参数),它也可以工作。在帮助中:“如果
useBytes
TRUE
则匹配是逐字节进行的,而不是逐字符进行的。”这可能是它在
gsub
中失败的部分原因

但是,
regexpr
regexec
gregexpr
都找到了所有正确的位置(我用
[[:space:][]替换了
\\s
以提高可读性,并且只使用了
regexpr
的输出:

regexpr("[[:space:]]{2,}", x2)

## [1] NA  1  1  1
## attr(,"match.length")
## [1] NA  5  9  6
所以,正则表达式本身是好的


更新:快速浏览一下R3.1.1的
grep.c
中的
do_gsub
并没有产生太多的洞察力(这是一个由
if/else
语句组成的扭曲迷宫:-),但我几乎想把它称为一个bug。

只是总结一下这个问题:正如其他几个人所建议的那样,这种行为实际上是一个bug。报告和确认如下:


您是否检查过添加更多的反斜杠?在R中,这相当棘手。通常需要三个斜杠才能识别此类斜杠expressions@Llopis这是不正确的。正则表达式实际上是
\s
,我们在它前面加了一个反斜杠以得到
\\s
。在OSX上也得到了确认。
\s
[:space:]
展示该行为,而文字空格字符(或空格/制表符类)工作正常。我认为R中存在bug。@MarkReed另一位用户早些时候指出,问题在Windows下不会出现。这种不一致的行为可能确实是一个bug。在Windows下,它工作正常,因此如果是bug(我不这么认为)祝你好运找到它。什么?正则表达式中的一个bug?谁知道呢?:-)
regexpr("[[:space:]]{2,}", x2)

## [1] NA  1  1  1
## attr(,"match.length")
## [1] NA  5  9  6