正则表达式匹配所有但不特定的字符串

时间:2019-01-31 14:09:02

标签: regex

我有一些xml文件,想删除除特定字符串以外的所有内容。

StackOverflow上还有很多其他类似的问题,但是它们都不适用于我的文件,在尝试使用不同的正则表达式几个小时后,我想寻求帮助。

到目前为止,部分成功但未完全成功的最接近的正则表达式是:

^((?!<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,因此可以将示例粘贴到此处,以查看为什么rex仅部分起作用。简而言之,它与的第一个匹配项不匹配,但与第二个匹配项匹配。我期望的是,正则表达式与<query>.*</query>

的任何出现都不匹配

fx。我想匹配任何东西,但不匹配以下字符串:

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

1 个答案:

答案 0 :(得分:0)

抱歉,响应延迟。部分原因是因为我在工作,部分原因是这种情况实际上对我来说还很陌生(我 love 正则表达式,但是我没有接触过这种情况,所以(这对我们俩都是一次学习的经历),但我认为我可能有您想要的解决方案。

我基本上想做的是在表达式中使用一些递归,并结合使用负向超前和负向超前来确保我没有捕获任何<query>标签

<(?!query).*(?<!<\/query)(?R)*>
  • <-匹配文字字符<以匹配开始标签的开头
  • (?!query)-与所有<后面的所有文本开头标签匹配,query
  • .*-匹配所有字符(包括开始标签的>),直到:
  • (?<!<\/query),这是一个否定的后向断言,以确保我不会从.*处获得文本,而</query结束标记前没有任何内容(请注意缺少的{{1} })。
  • >-这是我花了一些时间来思考的部分,因此我可能会放弃这一解释,因为我以前没有使用过。在此模式之前,无论该模式是什么,它都会从当前字符串位置递归整个正则表达式。现在我知道这听起来很令人困惑,因为它(对我来说还是有点)也令人困惑。但是,我相信一旦(?R)*找到它的第一个匹配项,即<(?!query).*(?<!<\/query),就会从<search>的结尾重复整个模式。因此,它将随后检查开始<search>和结束<query标签。如果找到它,它将跳过它。
  • </query-与文字结束标记>匹配,如果XML正确编写,则XML应该与>的结束标记匹配。

使用以下正则表达式here

测试示例

我真诚地希望这会有所帮助!