2016-12-11 2 views
0

Образец текста:Regex Match текст в Capture Группа

\- !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», где «имя» равна некоторой строке , Предположим, что оно равно last_name. Атрибуты не в каком-либо определенном порядке. Я исследовал использование групп захвата, но я не очень далеко.

Любая помощь по этому вопросу будет оценена по достоинству. Благодаря!

+0

Это должно быть полезным: http://stackoverflow.com/questions/19193251/ regex-to-get-the-words-after-matching-string – Travis

+0

Спасибо @Travis Это помогает. Однако в этом примере «Имя объекта» уникально. В моем случае string_value может повторять бесконечное число раз. Я могу получить строку после «string_value», но «имя» должно быть равно определенному значению внутри одного и того же блока. – Moody

+0

Ответ на этот вопрос зависит от следующего: какой инструмент вы используете для выполнения регулярного выражения? И что вы хотите делать с каждым матчем? В зависимости от вашего инструмента, самым простым решением будет просто цикл и поиск снова из предыдущего местоположения + 1, пока не будет найдено больше совпадений. * (что обязательно будет использовать язык, отличный от регулярного выражения, чтобы управлять поиском, хотя) * – Travis

ответ

0

Вы можете попробовать это регулярное выражение:

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

Explanation

  1. string_value: соответствует персонажам string_value:
  2. положительный предпросмотр (?=(?:(?!attributes_cache).)*name: last_name) он смотрит вперед, чтобы увидеть, если он содержит name: last_name, но не будет выходить за рамки attributes_cache , в противном случае он может перекрываться со следующим набором результатов, который может иметь имя: last_name
  3. \s+ соответствует любому символ пробела (равный [\ г \ п \ т \ е \ v])
  4. кванторных - Матчи между одной и неограниченное количество раз, столько раз, сколько возможно, отдавая при необходимости (жадный)
  5. \" соответствует символу " буквально (чувствительно к регистру)
  6. первой группа записи (\w+): \ ш + соответствует любому символу (равному [A-Za-z0-9_]) => это текст, который вы хотите захватить.

Группа захвата 1 содержит текст, который вы ищете.

Хотя вы не описали язык программирования, но в следующем примере делается на рубин (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 
+1

Спасибо @Maverick_Mrt, это отлично работает. Я изменил пару вещей, чтобы учесть несколько слов. Оказывается, MySQL не разрешает группы захвата, поэтому мне пришлось прибегать к анализу YAML в ruby, итерации через объекты и тестированию каждого string_value/name. – Moody

+0

@ Moody рада узнать, что он отлично работает –