在正则表达式字符类中忽略转义字符

时间:2014-12-17 21:28:37

标签: regex json r

一位同事给了我一个分隔文件。一列包含类似JSON的键/值对。我想把它们解析成列表。不幸的是,同事' JSON表示法似乎与 rjson 的期望相匹配。

jsonString <- "{person:[Santa],location:[NorthPole]}"
fromJSON(jsonString)
Error in fromJSON(jsonString) : 
  unexpected character "p"; expecting opening string quote (") for key value

所以我决定做一些正则表达式清理,将方括号转换成引号。我可以替换&#39; [&#39;与&#39;&#34;&#39;,但我在更换&#39; [&#39;和&#39;]&#39;在同一个操作中:

gsub(pattern = "\\[", replacement = '"', x = jsonString)
[1] "{person:\"Santa],location:\"NorthPole]}"

角色类是可能的:

gsub(pattern = "[aeiou]", replacement = '"', x = jsonString)
[1] "{p\"rs\"n:[S\"nt\"],l\"c\"t\"\"n:[N\"rthP\"l\"]}"

但是在这种情况下,没有检测到括号:

gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString)
[1] "{person:[Santa],location:[NorthPole]}"

我也可以使用其他非正则表达式解决方案将类似JSON的字符串解析为R数据对象。

2 个答案:

答案 0 :(得分:2)

我不知道这是否足够通用但它适用于你的简单案例:

> require(RJSONIO)
Loading required package: RJSONIO
> qjson <- gsub(patt="(\\w+)", repl='"\\1"', gsub("[][]", "", jsonString) )
> fromJSON(qjson)
     person    location 
    "Santa" "NorthPole" 

取出所有&#34; [&#34;和&#34;]&#34;并在所有&#34;单词&#34;周围加上双引号。 &#34; [&#34;和&#34;]&#34;字符是字符串敏感的位置。要匹配文字 - &#34;]&#34;它需要是第一个并且与文字匹配 - &#34; [&#34;它需要在任何地方,但首先。请参阅有关字符类的?regex部分。

答案 1 :(得分:1)

我无法准确说明原因,但设置perl=TRUE似乎解决了

gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString, perl=TRUE)
# [1] "{person:\"Santa\",location:\"NorthPole\"}"

必须与基本解释器解析字符类的方式不同。

您还可以尝试使用正则表达式直接提取数据。在这里,我使用regcapturedmatches辅助函数。

m<-gregexpr("(\\w+):\\[([^]]*)\\]", jsonString, perl=T)
regcapturedmatches(jsonString , m)

# [[1]]
#      [,1]       [,2]       
# [1,] "person"   "Santa"    
# [2,] "location" "NorthPole"