我有一些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 <<FIELD>>=round('<<FIELD>>'/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>
答案 0 :(得分:0)
抱歉,响应延迟。部分原因是因为我在工作,部分原因是这种情况实际上对我来说还很陌生(我 love 正则表达式,但是我没有接触过这种情况,所以(这对我们俩都是一次学习的经历),但我认为我可能有您想要的解决方案。
我基本上想做的是在表达式中使用一些递归,并结合使用负向超前和负向超前来确保我没有捕获任何<query>
标签
<(?!query).*(?<!<\/query)(?R)*>
<
-匹配文字字符<
以匹配开始标签的开头(?!query)
-与所有<
后面的所有文本开头标签匹配,query
.*
-匹配所有字符(包括开始标签的>
),直到:(?<!<\/query)
,这是一个否定的后向断言,以确保我不会从.*
处获得文本,而</query
结束标记前没有任何内容(请注意缺少的{{1} })。>
-这是我花了一些时间来思考的部分,因此我可能会放弃这一解释,因为我以前没有使用过。在此模式之前,无论该模式是什么,它都会从当前字符串位置递归整个正则表达式。现在我知道这听起来很令人困惑,因为它(对我来说还是有点)也令人困惑。但是,我相信一旦(?R)*
找到它的第一个匹配项,即<(?!query).*(?<!<\/query)
,就会从<search>
的结尾重复整个模式。因此,它将随后检查开始<search>
和结束<query
标签。如果找到它,它将跳过它。</query
-与文字结束标记>
匹配,如果XML正确编写,则XML应该与>
的结束标记匹配。使用以下正则表达式here
测试示例我真诚地希望这会有所帮助!