在r(windows)中查找具有递归限制的字符串中的JSON

在r(windows)中查找具有递归限制的字符串中的JSON,r,json,windows,R,Json,Windows,我想构建一个函数,该函数在Windows上以一种通用的方式从字符串中提取JSON,用于使用R的变量字符串格式 感谢SO,我正在使用: allJSONS <- gregexpr( pattern = "\\{(?:[^{}]|(?R))*?\\}", perl = TRUE, text = jsonString ) %>% regmatches(x = jsonString) 证明确实存在JSON: library(magrittr) library(jsonli

我想构建一个函数,该函数在Windows上以一种通用的方式从字符串中提取JSON,用于使用R的变量字符串格式

感谢SO,我正在使用:

allJSONS <- gregexpr(
  pattern = "\\{(?:[^{}]|(?R))*?\\}",
  perl = TRUE,
  text = jsonString
) %>%
  regmatches(x = jsonString)
证明确实存在JSON:

library(magrittr)  
library(jsonlite)

rp <- gsub(pattern = "memmCellmemm(", fixed = TRUE, replacement = "", x = jsonString)
rp <- substring(rp, first = 1, last = nchar(rp)-1) 
json <- rp %>% fromJSON
目标:

构建一个函数,该函数以通用方式从字符串中提取JSON,用于在Windows上使用R的变量字符串格式

我知道我可以用提供的代码提取json:

rp <- gsub(pattern = "memmCellmemm(", fixed = TRUE, replacement = "", x = jsonString)
rp <- substring(rp, first = 1, last = nchar(rp)-1) 
但是我需要一个更通用的函数,比如顶部的regex,因为文件格式在输入数据中可能会有很大的不同

/(([\x20\t\h\r\n]*)(?:(?:{(?:(?2)|,?((?2)"(?:[^\\"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xA\xB\xC\xD\xE\xF\x7F]|\\u[0-9A-F]{4}|\\t|\\r|\\n|\\f|\\b|\\\/|\\\\|\\"|\\")*"(?2)):(?1))+})|(?:\[(?:(?2)|,?(?1))+\])|(?3)|(?:-?(?:[1-9](?:[0-9]+)?|0)(?:\.[0-9]+)?(?:[Ee][+-]?[0-9]+)?)|true|false|null)(?2))/im
我编写了这个正则表达式,用于使用PCRE将字符串中的JSON与php进行匹配,它可以正常工作。它的基础是。您可能需要其他语言的代码,但我对该语言一无所知。但因为它的正则表达式,我认为它可以被转换成某种形式,并且可能不会有太大的区别


我编写了这个正则表达式,用于使用PCRE将字符串中的JSON与php进行匹配,它可以正常工作。它的基础是。您可能需要其他语言的代码,但我对该语言一无所知。但是因为它的正则表达式,我认为它可以通过某种方式进行转换,并且可能不会有太大的区别。

这个问题源于正则表达式的这一部分:?:[^{}]| R*。通过简单地将其更改为?:[^{}]+| R*,问题就消失了。我不确定为什么会发生这种情况,但我假设您基本上简化了regex用来测试字符串的路径,方法是测试字符是否为那些字符,以及是否应该重做模式

gregexpr(
  pattern = "\\{(?:[^{}]+|(?R))*?\\}",
  perl = TRUE,
  text = jsonString
)

#> [[1]]
#> [1] 14
#> attr(,"match.length")
#> [1] 134539
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
但是,如果您想要一个更完整的解决方案,基于,您可以使用以下内容:

my_json_string = "adjkd({\"asdasd\": {\"asdasd\": 1234}}{\"asdasd\": 1234})"    
json_regexp = paste0(
    "(?(DEFINE)",
        "(?<number>-?(?=[1-9]|0(?!\\d))\\d+(\\.\\d+)?([eE][+-]?\\d+)?)",
        "(?<boolean>true|false|null)",
        "(?<string>\"([^\"\\\\]*|\\\\[\"\\\\bfnrt\\/]|\\\\u[0-9a-fA-F]{4})*\")",
        "(?<array>\\[(?:(?&json)(?:,(?&json))*)?\\s*\\])",
        "(?<pair>\\s*(?&string)\\s*:(?&json))",
        "(?<object>\\{(?:(?&pair)(?:,(?&pair))*)?\\s*\\})",
        "(?<json>\\s*(?:(?&object)|(?&array)|(?&number)|(?&boolean)|(?&string))\\s*)",
    ")",
    "(?&json)"
)

gregexpr(json_regexp, my_json_string, perl=T) 
    %>% regmatches(x = my_json_string)

#> [[1]]
#> [1] "{\"asdasd\": {\"asdasd\": 1234}}" "{\"asdasd\": 1234}"  

这个问题源于正则表达式中的这个部分:?:[^{}]|?R*。通过简单地将其更改为?:[^{}]+| R*,问题就消失了。我不确定为什么会发生这种情况,但我假设您基本上简化了regex用来测试字符串的路径,方法是测试字符是否为那些字符,以及是否应该重做模式

gregexpr(
  pattern = "\\{(?:[^{}]+|(?R))*?\\}",
  perl = TRUE,
  text = jsonString
)

#> [[1]]
#> [1] 14
#> attr(,"match.length")
#> [1] 134539
#> attr(,"index.type")
#> [1] "chars"
#> attr(,"useBytes")
#> [1] TRUE
但是,如果您想要一个更完整的解决方案,基于,您可以使用以下内容:

my_json_string = "adjkd({\"asdasd\": {\"asdasd\": 1234}}{\"asdasd\": 1234})"    
json_regexp = paste0(
    "(?(DEFINE)",
        "(?<number>-?(?=[1-9]|0(?!\\d))\\d+(\\.\\d+)?([eE][+-]?\\d+)?)",
        "(?<boolean>true|false|null)",
        "(?<string>\"([^\"\\\\]*|\\\\[\"\\\\bfnrt\\/]|\\\\u[0-9a-fA-F]{4})*\")",
        "(?<array>\\[(?:(?&json)(?:,(?&json))*)?\\s*\\])",
        "(?<pair>\\s*(?&string)\\s*:(?&json))",
        "(?<object>\\{(?:(?&pair)(?:,(?&pair))*)?\\s*\\})",
        "(?<json>\\s*(?:(?&object)|(?&array)|(?&number)|(?&boolean)|(?&string))\\s*)",
    ")",
    "(?&json)"
)

gregexpr(json_regexp, my_json_string, perl=T) 
    %>% regmatches(x = my_json_string)

#> [[1]]
#> [1] "{\"asdasd\": {\"asdasd\": 1234}}" "{\"asdasd\": 1234}"  

在字符串中,您希望一个或多个JSON子字符串彼此不嵌套?很明显,非JSON字符串的JSON子字符串通常会包含多个有效的JSON子字符串本身。您也想要这些子字符串吗?谢谢您的提问!如果它们是多个的,我想将它们全部提取出来,是的。在字符串中,您希望一个JSON子字符串或多个JSON子字符串不嵌套在彼此之间吗?很明显,非JSON字符串的JSON子字符串通常会包含多个有效的JSON子字符串本身。您也想要这些子字符串吗?谢谢您的提问!如果它们是多重的,我想把它们全部提取出来,是的,很简单。太好了,非常感谢。接受答案,以便自动分配赏金!这么简单。太好了,非常感谢。接受答案,以便自动分配赏金!谢谢你的回答。我试过了,但在试图转义R中的正则表达式字符时出现了一些错误。然后答案出来了,它是可复制的,所以我接受了它。希望你一切顺利。投票支持你的答案!谢谢你的回答。我试过了,但在试图转义R中的正则表达式字符时出现了一些错误。然后答案出来了,它是可复制的,所以我接受了它。希望你一切顺利。投票支持你的答案!