如何使用正则表达式提取json字段?

Jam*_*per 6 regex text json replace editpad

初学者RegExp问题.我在文本文件中有JSON行,每个都有稍微不同的Fields,但如果有的话,我想为每行提取3个字段,忽略其他所有字段.我如何使用正则表达式(在编辑板或其他任何地方)执行此操作?

例:

"url":"http://www.netcharles.com/orwell/essays.htm",
"domain":"netcharles.com",
"title":"Orwell Essays & Journalism Section - Charles' George Orwell Links",
"tags":["orwell","writing","literature","journalism","essays","politics","essay","reference","language","toread"],
"index":2931,
"time_created":1345419323,
"num_saves":24
Run Code Online (Sandbox Code Playgroud)

我想提取URL,TITLE,TAGS,

Fra*_*Man 18

/"(url|title|tags)":"((\\"|[^"])*)"/i
Run Code Online (Sandbox Code Playgroud)

我想这就是你所要求的.我会暂时提供一个解释.这个正则表达式(由/ - 您可能不必将它们放在编辑板中)分隔匹配:

"
Run Code Online (Sandbox Code Playgroud)

文字".

(url|title|tags)
Run Code Online (Sandbox Code Playgroud)

正则表达式中的三个文字字符串"url","title"或"tags"中的任何一个 - 默认情况下,括号用于创建组,管道字符用于交替 - 如逻辑"或".要匹配这些文字字符,您必须转义它们.

":"
Run Code Online (Sandbox Code Playgroud)

另一个文字字符串.

(
Run Code Online (Sandbox Code Playgroud)

另一组的开始.(第2组)

    (
Run Code Online (Sandbox Code Playgroud)

另一组(3)

        \\"
Run Code Online (Sandbox Code Playgroud)

文字字符串\"- 你必须转义反斜杠,否则它将被解释为转义下一个字符,你永远不会知道它会做什么.

        |
Run Code Online (Sandbox Code Playgroud)

要么...

        [^"]
Run Code Online (Sandbox Code Playgroud)

除双引号外的任何单个字符括号表示字符类/集,或匹配的字符列表.任何给定的类都匹配字符串中的一个字符.^在类的开头使用carat()会否定它,导致匹配器匹配类中未包含的任何内容.

    )
Run Code Online (Sandbox Code Playgroud)

第3组结束......

    *
Run Code Online (Sandbox Code Playgroud)

星号导致前一个正则表达式(在本例中为第3组)重复零次或多次,在这种情况下,使匹配器匹配任何可能在JSON字符串的双引号内的内容.

)"
Run Code Online (Sandbox Code Playgroud)

第2组结束,以及文字".

我在这里做了一些非显而易见的事情,可能会派上用场:

  1. 第2组 - 使用反向引用取消引用时- 将是分配给该字段的实际字符串.获取实际值时这很有用.
  2. 表达式末尾的i使其不区分大小写.
  3. 第1组包含捕获字段的名称.

编辑:所以我看到标签是一个数组.当我有机会思考它时,我会在一秒钟内更新正则表达式.

你的新正则表达式是:

/"(url|title|tags)":("(\\"|[^"])*"|\[("(\\"|[^"])*"(,"(\\"|[^"])*")*)?\])/i
Run Code Online (Sandbox Code Playgroud)

我在这里所做的就是替换我一直在使用的字符串正则表达式("((\\"|[^"])*)"),以及用于查找数组(\[("(\\"|[^"])*"(,"(\\"|[^"])*")*)?\])的正则表达式.没有那么容易阅读,是吗?好吧,我们将字符串正则表达式替换为字母S,我们可以将其重写为:

\[(S(,S)*)?\]
Run Code Online (Sandbox Code Playgroud)

它匹配文字左括号(因此是反斜杠),可选地后跟逗号分隔的字符串列表和结束括号.我在这里介绍的唯一新概念是问号(?),它本身就是一种重复.通常称为"使前一个表达式可选",它也可以被认为是0或1个匹配.

使用相同的S表示法,这是整个脏的正则表达式:

/"(url|title|tags)":(S|\[(S(,S)*)?\])/i
Run Code Online (Sandbox Code Playgroud)

如果它有助于看到它的实际效果,那么这就是它的实际应用.

  • 嗨@FrankieTheKneeMan,如果您想提取索引值,这将如何改变,并且整个 json 以方括号和大括号开头,例如。[{“索引”:2931,“num_saves”:24 (2认同)

cre*_*007 8

这个问题有点老了,但我在我的电脑上浏览了一下,发现了那个表达。我通过他作为 GIST,可能对其他人有用。

编辑:

# Expression was tested with PHP and Ruby
# This regular expression finds a key-value pair in JSON formatted strings
# Match 1: Key
# Match 2: Value
# https://regex101.com/r/zR2vU9/4
# http://rubular.com/r/KpF3suIL10

(?:\"|\')(?<key>[^"]*)(?:\"|\')(?=:)(?:\:\s*)(?:\"|\')?(?<value>true|false|[0-9a-zA-Z\+\-\,\.\$]*)

# test document
[
  {
    "_id": "56af331efbeca6240c61b2ca",
    "index": 120000,
    "guid": "bedb2018-c017-429E-b520-696ea3666692",
    "isActive": false,
    "balance": "$2,202,350",
    "object": {
        "name": "am",
        "lastname": "lang"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)


Sal*_*ndo 6

您想要从中提取字段值的 json 字符串

{"fid":"321","otherAttribute":"value"}
Run Code Online (Sandbox Code Playgroud)

以下正则表达式精确提取“fid”字段值“321”

(?<=\"fid\":\")[^\"]*
Run Code Online (Sandbox Code Playgroud)