我的元数据字符串如下所示:
{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3146, object=EntityDescriptor{objectID=1900, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 13 11:52:18 PDT 2014, modificationDate=Mon Jul 13 11:52:18 PDT 2014, properties={}}\",\"create\":true}
我需要提取objectID
。我一直在尝试使用模式匹配,但我一直在使用
例如,我为一个简单的测试创建了这个对象:
testme <- "{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3246, object=EntityDescriptor{objectID=1400, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 14 11:52:18 PDT 2014, modificationDate=Mon Jul 14 11:52:18 PDT 2014, properties={}}\",\"create\":true}"
我尝试以下操作,当我在一个名为RegEx Magic
的程序中创建并测试它时,它似乎工作正常,我在该程序中指定了我的R版本:
grep("\\AobjectID=[0-9]+[[:>:]]\\z", testme, perl=TRUE, value=TRUE);
但我得到的结果是:
character(0)
我尝试了一些更简单的方法,例如:
regexpr(pattern="\\<objectID=[0-9]{1,4}", testme, useBytes = FALSE, fixed = TRUE)
和
regexpr(pattern="\\bobjectID=[0-9]", testme, useBytes = FALSE)
那些导致了意想不到的结果(即我不确定它给了我什么,但它不是我想要的):
[1] -1
attr(,"match.length")
[1] -1
attr(,"useBytes")
[1] TRUE
或
[1] 176
attr(,"match.length")
[1] 10
attr(,"useBytes")
[1] TRUE
分别是。如果我删除\\b
或\\<
,则会返回整个元数据字符串。
有人可以帮我解决这个问题吗?提前谢谢。
答案 0 :(得分:2)
要清楚,您获得character(0)
结果的原因是因为您的正则表达式不正确。 \A
锚点匹配字符串开头的位置,\z
锚点匹配字符串最末端的位置。
您要搜索的子字符串位于字符串中的两个位置,实际上它位于中间位置。所以你需要删除锚点,你也可以删除与字符类相关的边界和perl=T
。
> grep("objectID=[0-9]+", x, value=TRUE)
# [1] "{\"vote\":\"com.jivesoftware.community.acclaim.impl.VoteImpl@8b6b31f7\",\"referringSource\":null,\"referringUser\":null,\"acclaim\":\"AcclaimImpl{acclaimID=3246, object=EntityDescriptor{objectID=1900, objectType=102}, acclaimType='like', visibility=true, creationDate=Mon Jul 14 11:52:18 PDT 2014, modificationDate=Mon Jul 14 11:52:18 PDT 2014, properties={}}\",\"create\":true}"
注意: grep(value = TRUE)
会返回包含所选元素的字符向量。
如果你想获取子字符串值,基数R处理这个就好了。
> regmatches(x, gregexpr('(?<=\\bobjectID=)\\d+', x, perl=T))[[1]]
# [1] "1900"
或者您只需使用stringr
库即可。
> library(stringr)
> str_extract(x, perl('(?<=\\bobjectID=)\\d+'))
# [1] "1900"
答案 1 :(得分:1)
您可以找到objectID
和objectType
的位置,然后选择相对于这些位置的数据。
require(stringr)
objectID_loc <- str_locate(x, "objectID")
objectType_loc <- str_locate(x, "objectType")
objectID <- substr(x, objectID_loc[, "end"] + 2, objectType_loc[, "start"] - 3)
这会给你:
> objectID
[1] "1900"
答案 2 :(得分:1)
使用您的第一个示例字符串尝试此操作。它匹配正则表达式并返回括号内的部分:
> library(gsubfn)
> strapplyc(s, "objectID=(\\d+)")[[1]]
[1] "1900"