这个评论 是关于 这个问题 的,它应该使用 strsplit
可以得到所需的结果,但实际上并没有,尽管它似乎正确地匹配了字符向量中的第一个和最后一个逗号。使用gregexpr
和regmatches
可以证明这一点。
那么为什么在这个例子中strsplit
会在每个逗号处分割,尽管regmatches
只返回相同正则表达式的两个匹配项?
# We would like to split on the first comma and
# the last comma (positions 4 and 13 in this string)
x <- "123,34,56,78,90"
# Splits on every comma. Must be wrong.
strsplit( x , '^\\w+\\K,|,(?=\\w+$)' , perl = TRUE )[[1]]
#[1] "123" "34" "56" "78" "90"
# Ok. Let's check the positions of matches for this regex
m <- gregexpr( '^\\w+\\K,|,(?=\\w+$)' , x , perl = TRUE )
# Matching positions are at
unlist(m)
[1] 4 13
# And extracting them...
regmatches( x , m )
[[1]]
[1] "," ","
咦?发生了什么事情?
strsplit
函数会在每次分割后迭代/递归地处理剩余的字符串,比如说"123,34,56,78,90"
->["123", "34,56,78,90"]
->["123", "34", "56,78,90"]
。我对R语言一无所知,但这个假设是可以进行测试的,直到你找到更好的解释为止 :) 或者也有可能只是实现的简单错误,你可以尝试不同版本的R。 - Aprillionstrsplit
在第一次匹配时执行非全局分割,因为你使用regexpr
而不是gregexpr
得到相同的结果。我想知道是否可能使strsplit
进行全局匹配...? - Simon O'Hanlon'/^\w+\K,|,(?=\w+$)/'
在 PHP 中使用 'preg_split()' 正确地拆分了字符串。看起来这可能表明 PCRE 的 r 实现存在问题。 - ridgerunner