作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 gregexpr()
进行常识和健全性检查指示下面的后视和前视断言应该每个都在 testString
中的一个位置匹配。 :
testString <- "text XX text"
BB <- "(?<= XX )"
FF <- "(?= XX )"
as.vector(gregexpr(BB, testString, perl=TRUE)[[1]])
# [1] 9
as.vector(gregexpr(FF, testString, perl=TRUE)[[1]][1])
# [1] 5
strsplit()
,但是,以不同的方式使用这些匹配位置,拆分
testString
在
一 使用后视断言时的位置,但在
两个位置——第二个似乎不正确——在使用前瞻断言时。
strsplit(testString, BB, perl=TRUE)
# [[1]]
# [1] "text XX " "text"
strsplit(testString, FF, perl=TRUE)
# [[1]]
# [1] "text" " " "XX text"
strsplit()
表现得更好?
最佳答案
我不确定这是否属于错误,因为我相信这是基于 R 文档的预期行为。来自 ?strsplit
:
The algorithm applied to each input string is
repeat {
if the string is empty
break.
if there is a match
add the string to the left of the match to the output.
remove the match and all to the left of it.
else
add the string to the output.
break.
}Note that this means that if there is a match at the beginning of a (non-empty) string, the first element of the output is ‘""’, but if there is a match at the end of the string, the output is the same as with the match removed.
FF <- "(?=funky)"
testString <- "take me to funky town"
gregexpr(FF,testString,perl=TRUE)
# [[1]]
# [1] 12
# attr(,"match.length")
# [1] 0
# attr(,"useBytes")
# [1] TRUE
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "take me to " "f" "unky town"
(?=funky)
在位置 12 处匹配。因此,第一个拆分包括位置 11(匹配项左侧)之前的字符串,并将其与匹配项一起从字符串中删除,但匹配项的长度为零。
funky town
, 并且前瞻在位置 1 处匹配。但是没有什么要删除的,因为匹配的左边没有任何东西,而且匹配本身的长度为零。所以算法陷入了无限循环。显然,R 通过拆分单个字符来解决这个问题,顺便提一下,这是
strsplit
时记录的行为。使用空的正则表达式(当参数为
split=""
时)。在此之后剩余的字符串是
unky town
,因为没有匹配,它作为最后一个分割返回。
strsplit
算法被记录在案,我相信这不符合错误的定义。
关于regex - 为什么 strsplit 使用积极的前瞻和后视断言匹配不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15575221/
谁能解释当应用程序通过 802.11 WiFi 网络发送 UDP 单播数据报时它是如何工作的?假设非阻塞 UDP 套接字。具体而言,假设 802.11n 或 802.11ac 以及相当新的 Linux
我是一名优秀的程序员,十分优秀!