【问题标题】:Not able to select the right data无法选择正确的数据
【发布时间】:2020-02-27 05:47:35
【问题描述】:

我收到了一个不会更改的旧版 xml。 格式化后的样子是这样的:

<Result>
    <StepSequence>
      <RealMeasure>
        <Text value="Batman"/>
      </RealMeasure>
    </StepSequence>
    <StepSequence>
      <RealMeasure>
        <Text value="Superman"/>
      </RealMeasure>
    </StepSequence>
</Result>

其实是这样的:

<Result><StepSequence><RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure></StepSequence></Result>

我想出的正则表达式是:

<RealMeasure><((\w*)\s+value="(.*)".*?)></RealMeasure>

但它正在选择数据:

<RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure>

我要选择: &lt;RealMeasure&gt;&lt;Text value="Batman"/&gt;&lt;/RealMeasure&gt;

&lt;RealMeasure&gt;&lt;Text value="Superman"/&gt;&lt;/RealMeasure&gt;

我想获取组,以便以后可以将匹配转换为: &lt;RealMeasure type="Text" value="Superman"/&gt;

使用如下模式:

<RealMeasure type="$2" value=$3>

Link to online regex tester

有什么提示可以改进我的正则表达式吗?

【问题讨论】:

  • 你在点后面有一个非常贪婪的量词,这意味着它会匹配到最后一个引号。
  • 有没有办法提高效率?我不是正则表达式专家。匹配会发生很多,并且会对性能产生影响。如果您可以提出更有效的建议,请添加为答案。

标签: regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

试试这个 -

let reg = /<RealMeasure><((\w+)\s+value="(.*?)".*?)><\/RealMeasure>/g;
let str= `<Result><StepSequence><RealMeasure><Text value="Batman"/></RealMeasure></StepSequence><StepSequence><RealMeasure><Text value="Superman"/></RealMeasure></StepSequence></Result>`;
str.replace(reg, `<RealMeasure type="$2" value="$3"/>`); //<Result><StepSequence><RealMeasure type="Text" value="Batman"/></StepSequence><StepSequence><RealMeasure type="Text" value="Superman"/></StepSequence></Result>

value="(.*?)" 组也必须是非贪婪的。并将(\w*)改为(\w+),保证type不为空。

另外,&lt;/RealMeasure&gt; 中的/ 必须像&lt;\/RealMeasure&gt; 一样转义。

【讨论】:

    【解决方案2】:

    我使用了以下正则表达式:

    <RealMeasure><(\w+).*?("[^"]*").*?<\/RealMeasure>
    

    它似乎正在做你想要的。

    测试here。详细说明在页面右侧。

    请注意,您使用的软件可能会对您可以使用的正则表达式功能施加一些限制。

    或者,使用适当的 XML 解析器来提取和重新格式化数据。

    【讨论】:

    • 非常感谢。我不是正则表达式方面的专家,因此无法判断它是否优于其他人的建议。如果您觉得它更高级,请尽可能添加详细信息。
    • 你如何定义“性能”?您甚至没有指定要使用什么软件来处理正则表达式。我想性能最好的是我一开始就建议的适当的 XML 解析器,尤其是考虑到您要提取和处理数据,更改布局...
    • 我正在使用 Logstash(Elastic 的产品之一)将此 xml 处理为单独的数据项。他们支持这些regex formats
    猜你喜欢
    • 2014-11-16
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多