【问题标题】:Regex Match text within a Capture Group捕获组中的正则表达式匹配文本
【发布时间】:2017-04-26 05:44:19
【问题描述】:

示例文本:

\- !ruby/object:DynamicAttribute 
  attributes: 
    resource_id: "1"
    resource_type: Applicant
    string_value: "Michael"
    int_value: 
    id: "35972390"
    date_value: 
    name: first_name
  attributes_cache: {}

\- !ruby/object:DynamicAttribute 
  attributes: 
    resource_id: "1"
    resource_type: Applicant
    string_value: "Johnson"
    int_value: 
    id: "35533149"
    date_value: 
    name: last_name
  attributes_cache: {}

目标:

我正在尝试提取“string_value”之后的值,其中“name”等于某个字符串。假设它等于last_name。这些属性没有任何特定的顺序。我已经探索过使用捕获组,但我没有走多远。

对此的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 这应该会有所帮助:stackoverflow.com/questions/19193251/…
  • 谢谢@Travis 这有帮助。但是,在该示例中,“对象名称”是唯一的。就我而言, string_value 可以重复无数次。我可以在“string_value”之后检索字符串,但是“name”需要在同一个块中等于某个值。
  • 答案取决于以下几点:您使用什么工具来执行正则表达式?你想对每场比赛做什么?根据您的工具,最简单的解决方案就是从先前的位置 + 1 循环并再次搜索,直到找不到更多匹配项。 (不过,这必然会使用正则表达式以外的语言来驱动搜索)
  • 这将是 SQL 搜索的一部分。我会显示值。
  • 知道了。是的,这是我想看看这是否可以用正则表达式完成的第一条路径。我会走一条更传统的路线并编写脚本。

标签: regex string regex-lookarounds capture-group


【解决方案1】:

你可以试试这个正则表达式:

string_value:(?=(?:(?!attributes_cache).)*name: last_name)\s+\"(\w+)\".*?attributes_cache

Explanation

  1. string_value: 匹配字符 string_value:
  2. Positive Lookahead (?=(?:(?!attributes_cache).)*name: last_name) 它向前看是否包含 name: last_name 但不会超出 attributes_cache ,否则可能会与下一个可能具有名称的结果集重叠:last_name
  3. \s+ 匹配任何空白字符(等于 [\r\n\t\f\v ])
  4. 量词 - 匹配一次到无限次,尽可能多次,按需回馈(贪婪)
  5. \" 匹配字符 " 字面意思(区分大小写)
  6. 第一捕获组(\w+) : \w+ 匹配任何单词字符(等于 [a-zA-Z0-9_])=> 这是您要捕获的文本。

捕获组 1 包含您要查找的文本。

虽然您没有描述编程语言,但以下示例是在 ruby​​ 上完成的 (run it) :

re = /string_value:(?=(?:(?!attributes_cache).)*name: last_name)\s+\"(\w+)\".*?attributes_cache/m
str = '\\- !ruby/object:DynamicAttribute 
  attributes: 
    resource_id: "1"
    resource_type: Applicant
    string_value: "Johnson1"
    int_value: 
    id: "35533149"
    date_value: 
    name: last_name
  attributes_cache: {}

\\- !ruby/object:DynamicAttribute 
  attributes: 
    resource_id: "1"
    resource_type: Applicant
    string_value: "Michael"
    int_value: 
    id: "35972390"
    date_value: 
    name: first_name
  attributes_cache: {}

\\- !ruby/object:DynamicAttribute 
  attributes: 
    resource_id: "1"
    resource_type: Applicant
    string_value: "Johnson2"
    int_value: 
    id: "35533149"
    date_value: 
    name: last_name
  attributes_cache: {}'

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

【讨论】:

  • 谢谢@Maverick_Mrt 这很好用。我修改了一些东西来解释多个单词。事实证明 MySQL 不允许捕获组,所以我不得不求助于在 ruby​​ 中解析 YAML,遍历对象,并测试每个 string_value/name。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多