【问题标题】:Regex: Javascript, XML, String正则表达式:Javascript、XML、字符串
【发布时间】:2020-01-31 02:50:16
【问题描述】:

我在一个变量中有以下数据。

<ctx>
  <PostCode>XXXXXX</PostCode>
  <Title1>Mr</Title1>
  <Name>John</Name>
  <Order1>£100.00</Order1>
  <Order2>£100.01</Order2>
  <Date>10/10/2010</Date
</ctx>

使用以下正则表达式 var payload = ctx.toString().match(/Order[1-9]/g); 我得到以下结果

订单1,订单1,订单2,订单2

我怎样才能让它停在 Order1、Order2 以及计算第二个结束标签时,我也不能使用 &lt;Order[1-9]&gt;(开始标签),因为我的应用程序不允许我捕获标签 &lt;&gt;基本上是一个返回唯一值的正则表达式。

因此,以下正则表达式似乎在某种程度上起作用。 (Order[0-9])(?!.*\1)

https://regex101.com/r/6QhFBg/1

【问题讨论】:

    标签: javascript regex xml soap


    【解决方案1】:

    永远不要使用正则表达式解析 XML。 错误的工作工具 - 导致脆弱的解决方案。

    改为使用真正的 XML 解析器或 XPath。

    例如,这个 XPath,

    //*[starts-with(local-name(), 'Order')]
    

    将稳健地选择名称以"Order" 开头的所有元素。

    在浏览器的 JavaScript 中,XPath 表达式通过 document.evaluate 计算:

    var orders = document.evaluate('//Order[starts-with(local-name(), 'Order')]', document, 
                                   null, XPathResult.ANY_TYPE, null );
    var thisOrder = orders.iterateNext();
    
    while (thisOrder) {
      console.log(thisOrder.textContent);
      thisOrder = orders.iterateNext();
    }
    

    另见How to use document.evaluate() and XPath to get a list of elements?

    关于解析存储在字符串中的 XML,例如:

    【讨论】:

      【解决方案2】:

      let ctx = 
      `<ctx>
        <PostCode>XXXXXX</PostCode>
        <Title1>Mr</Title1>
        <Name>John</Name>
        <Order1>£100.00</Order1>
        <Order2>£100.01</Order2>
        <Date>10/10/2010</Date
      </ctx>`;
      
      let payload = ctx
        .match(/<Order[1-9]>/g) // e.g. <Order1>
        .map(o => o.substring(1, o.length - 1)); // trim first char `<` and last char `>`
      
      console.log(payload);

      【讨论】:

      • 谢谢,如果我的应用程序允许我捕获包括标签和锚点在内的整个有效负载结构 &lt;&gt;,这会起作用,但我不能使用 &lt;Order[1-9]&gt;
      • 您阅读下一行 (.map(...) 了吗?它删除了&lt;&gt;
      • 是否有匹配 Order[1-9] 但只返回唯一值的正则表达式变体。
      • Regex 不会执行诸如“查找唯一值”或“映射整数以使其值加倍”之类的操作。但这就是js 的用武之地。
      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多