我需要将一个字符串拆分为三个部分(itemName,delimiter,itemNum)。作为在R中学习正则表达式/字符串函数的第一次尝试,我使用“regex-magic”来生成模式
grepl("\\A[[:<:]][A-Za-z]+[._~-]*(?:[0-9]+)+[[:>:]]\\z", "bob.~-1234", perl=TRUE);
我想我理解,这三种模式:[A-Za-z]+
,[._~-]*
和[0-9]+
是指。我对\\A[[:<:]]
和+[[:>:]]\\z
一无所知。我也不明白如何指定可选的分隔符。
此外,我需要使用哪个函数返回包含三个部分的向量:"bob"
,".~-"
,"1234"
?
答案 0 :(得分:3)
\A
是一个锚,它断言字符串中的当前位置是字符串的开头。 \z
锚点断言字符串中的当前位置是字符串的非常结尾。 POSIX word boundaries定义为[[:<:]]
和[[:>:]]
。第一个是单词起始边界,第二个是单词结束边界。你可以把它们留在这里。
您可以使用gsubfn包中的strapply
来匹配整个模式。
strapply('bob.~-1234', '\\A([a-zA-Z]+)([._~-]*)(\\d+)\\z', c, perl=T)[[1]]
# [1] "bob" ".~-" "1234"
答案 1 :(得分:2)
POSIX标准将[[:<:]]
定义为词头边界,将[[:>:]]
定义为词尾边界。
您可以尝试以下strsplit
功能来获得所需的输出。
> strsplit("bob.~-1234", "(?<=[._~-])(?=[0-9])|(?<=[A-Za-z])(?=[._~-])",perl=T)
[[1]]
[1] "bob" ".~-" "1234"
OR
> strsplit("bob.~-1234", "(?<=\\w)(?=\\W)|(?<=\\W)(?=\\w)",perl=T)
[[1]]
[1] "bob" ".~-" "1234"