регулярное выражение соответствует всем, но не конкретной строке - PullRequest
0 голосов
/ 31 января 2019

У меня есть XML-файл, и я хочу удалить все, кроме определенной строки.

В StackOverflow есть и другие подобные вопросы, но ни один из них не подходит для моего файла, и после нескольких часов попыток использовать другое регулярное выражение Iхотел бы попросить о помощи.

На данный момент ближайшим регулярным выражением, которое удалось частично, но не полностью, является:

^((?!<query.*<\/query>).)*$

образец файла XML:

      <search>
          <query>index=_internal [`set_local_host`] source=*license_usage.log* type="Usage" | eval h=if(len(h)=0 OR isnull(h),"(SQUASHED)",h) | eval s=if(len(s)=0 OR isnull(s),"(SQUASHED)",s) | eval idx=if(len(idx)=0 OR isnull(idx),"(UNKNOWN)",idx) | bin _time span=1d | stats sum(b) as b by _time, pool, s, st, h, idx   | timechart span=1d sum(b) AS volumeB by st fixedrange=false  | join type=outer _time [search index=_internal [`set_local_host`] source=*license_usage.log* type="RolloverSummary"  | eval _time=_time - 43200 | bin _time span=1d | stats latest(stacksz) AS "stack size" by _time] | fields - _timediff  | foreach * [eval &lt;&lt;FIELD&gt;&gt;=round('&lt;&lt;FIELD&gt;&gt;'/1024/1024/1024, 3)] </query>
          <earliest>$central_time.earliest$</earliest>
          <latest>$central_time.latest$</latest>
          <sampleRatio>1</sampleRatio>
        </search>
        <option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
        <option name="charting.chart.stackMode">stacked</option>
        <option name="charting.chart.style">shiny</option>
        <option name="trellis.scales.shared">1</option>
        <option name="trellis.size">medium</option>
      </chart>
    </panel>
  </row>
  <row>
    <panel>
      <chart>
        <search>
          <query>index=_introspection  sourcetype=splunk_resource_usage component=hostwide saxsa
| eval tcu = ('data.cpu_system_pct' + 'data.cpu_user_pct')
| timechart limit=0 span=1d avg(tcu) by host</query>
          <earliest>$central_time.earliest$</earliest>
          <latest>$central_time.latest$</latest>
          <sampleRatio>1</sampleRatio>
        </search>

Я использую regex101, так что образецможно вставить туда, чтобы увидеть, почему рекс работает только частично.Короче говоря, он не соответствует первому вхождению, но соответствует второму вхождению.Я ожидаю, что регулярное выражение не соответствует ни одному из случаев <query>.*</query>

fx.Я хочу сопоставить что угодно, но не следующую строку:

<query>anything between(can be multiple lines*)</query>

1 Ответ

0 голосов
/ 31 января 2019

Извините за задержку ответа.Частично потому, что я на работе, частично из-за того, что этот тип ситуации был довольно новым для меня (я люблю регулярные выражения, но я не имел никакого отношения к этой ситуации, так что этоопыт обучения для нас обоих), но я думаю У меня может быть решение, которое вы ищете.

То, что я в основном пытался сделать, это использовать немного рекурсии в выражении с комбинацией негативного прогнозирования и негативного прогнозирования, чтобы убедиться, что я не собираю <query> теги

<(?!query).*(?<!<\/query)(?R)*>
  • < - соответствует буквенному символу <, совпадающему с началом открывающего тега
  • (?!query) - соответствует всем открывающим теги текста, начиная с <, исключая query
  • .* - Сопоставляет все символы (включая > открывающего тега) вплоть до:
  • (?<!<\/query), что является отрицательным утверждением, позволяющим убедиться в том, чтоЯ не получаю текст из .* с чем-либо до закрывающего тега </query (обратите внимание на отсутствующий >).
  • (?R)* - это та часть, которая мне понадобилась, чтобы обернутьмой разум вокруг, так что я могу, возможно, вырезать это объяснение, потому что я не использовал это раньше.Каким бы ни был шаблон ДО этого шаблона, он повторяет все регулярное выражение из текущей позиции строки.Теперь я знаю, что это звучит странно, потому что это (все еще немного ) меня тоже смущает.Но, я полагаю, как только <(?!query).*(?<!<\/query) найдет его первое совпадение, которое будет <search>, оттуда оно повторяет весь этот шаблон с конца <search>.Таким образом, он будет проверять открывающий тег <query и закрывающий тег </query.И если он находит его, он пропускает его.
  • > - Соответствует литеральному закрывающему тегу >, в котором, если XML написан правильно, он должен совпадать с закрывающим тегом <search.

Тест вашего примера со следующим регулярным выражением здесь

Я искренне надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...