Regex для извлечения подстроки из сложной строки - PullRequest
3 голосов
/ 28 мая 2020

У меня есть строка, которая может иметь два формата:

Первый формат:

route-policy testPolicy
  if (destination in pfx_manju) then
    set extcommunity rt (10429:103) additive
  endif
end-policy

Второй формат:

route-policy testPolicy
  if (destination in EXP1) then
    set extcommunity rt (27699:352002, 2.2.2.2:98) additive
  elseif (destination in pfx_manju) then
    set extcommunity rt (27699:339600, 27679:339700, 1.1.1.1:6763, 65536:45633) additive
  elseif (destination in EXP5) then
    drop
  endif
end-policy

Третий формат:

route-policy EXPORTRP1
  if (destination in EXP1) or (destination in EXP2) then
    set extcommunity rt (27699:352002, 2.2.2.2:98) additive
  elseif (destination in pfx_manju) or (destination in EXP4) then
    set extcommunity rt (27699:339600, 27679:339700, 1.1.1.1:6763, 65536:45633) additive
  elseif (destination in EXP5) or (destination in EXP6) then
    drop
  endif
end-policy

Итак, здесь полный текст представлен в виде строки. Строка либо одно условие (если), либо несколько условий (условия elseIf).

Из приведенной выше строки я хочу извлечь значения rt для одной жестко закодированной политики (pfx_manju). Я могу извлечь значения rt с помощью регулярного выражения ниже:

final String regex = "rt \\(([^)]+)\\)";

Теперь проблема в том, что я хочу извлечь подстроку, которая принадлежит жестко закодированной политике (pfx_manju).

Итак условие - получить подстроку с начальной позицией - это индекс pfx_manju , а конечной позицией - последующая endif или elseif .

Итак, я хочу вывод подстроки для приведенных выше примеров, как указано ниже,

Первая подстрока:

  pfx_manju) then
    set extcommunity rt (10429:103) additive

Вторая подстрока:

pfx_manju) then
        set extcommunity rt (27699:339600, 27679:339700, 1.1.1.1:6763, 65536:45633) additive

Третья подстрока:

pfx_manju) or (destination in EXP4) then
        set extcommunity rt (27699:339600, 27679:339700, 1.1.1.1:6763, 65536:45633) additive

Все предложения по решению optimisti c будут оценены

1 Ответ

3 голосов
/ 28 мая 2020

Следующее регулярное выражение должно работать

pfx_manju\)[\s\S]*?rt \(([^)]+)\) additive

Регулярное выражение соответствует строке, начиная с условия pfx_manju вплоть до rt значений, это означает, что оно захватывает значения rt, когда есть только pfx_manju состояние. если вы используете java, вам нужно scape, \.

См. регулярное выражение demo

...