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

Regex 在正则表达式字符类中忽略转义字符,regex,json,r,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

一位同事给了我一个带分隔符的文件。一列包含类似JSON的键/值对。我想把它们解析成列表。不幸的是,同事们的JSON符号似乎不符合rjson的期望

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

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数据对象。我不知道确切原因,但设置
perl=TRUE
似乎可以解决这一问题

gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString, perl=TRUE)
# [1] "{person:\"Santa\",location:\"NorthPole\"}"
基本解释器解析字符类的方式必须有所不同

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

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

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

m我不知道这是否足够一般,但它适用于您的简单案例:

> require(RJSONIO)
Loading required package: RJSONIO
> qjson <- gsub(patt="(\\w+)", repl='"\\1"', gsub("[][]", "", jsonString) )
> fromJSON(qjson)
     person    location 
    "Santa" "NorthPole" 
>需要(RJSONIO)
加载所需包:RJSONIO
>qjson fromJSON(qjson)
人员位置
“圣诞老人”“北极”

去掉所有“[”和“]”,并在所有“单词”周围加上双引号。“[”和“]”字符的字符类处理对字符串中的位置敏感。要匹配文字-“]”,它需要在第一位,而要匹配文字-“[”它需要在除第一位以外的任何位置。请参阅有关字符类的
?regex
部分。

尝试:
gsub(pattern=“\\[\124;]”,replacement=“”,x=jsonString)
您使用的是哪个
fromJSON
软件包?至少有三个软件包包含该函数name@nicola好主意。这是可行的,但对于在类中包含两个以上的字符,我想我更喜欢使用[]符号。@RichardScriven:rjson@MarkMiller然后使用
gsub(pattern=“[]\\[]”,replacement='“,x=jsonString)
我也这么做了,但它仍然不会用
fromJSON
解析,但我想这不是真正的问题,对吧,“真正的”JSON文件也会引用元素名。(即
“person”:“Santa”
)有人想建议一种将我同事的符号转换为真正的JSON的方法吗?这正是我现在需要的。我会密切关注泛化问题。正如预期的那样:值中的空格会破坏这个原本很好的建议…jsonString如果您希望空格不被破坏,可以将patt参数替换为……。
“[[:alpha:]+“
甚至
”[:alnum:]+“
”[[:alnum:]-\]+“
使用[[:alnum:]+],我能够解析我的750k生物医学术语对集。我认为我现在状态良好,可以根据需要修改此方法。
> require(RJSONIO)
Loading required package: RJSONIO
> qjson <- gsub(patt="(\\w+)", repl='"\\1"', gsub("[][]", "", jsonString) )
> fromJSON(qjson)
     person    location 
    "Santa" "NorthPole"