Java正则表达式和替换出现问题



我在获取正则表达式时遇到问题。我正在尝试为某些XML标记解析一个大的多行文本块。然而,我之所以不使用XML库来解析它,是因为它实际上也是ESQL块的一部分。我使用的线路如下:

Pattern.compile(".*'(Invoice|Package|Mapping|Post)' AS STAGE.*(<(ESQL|ProcessInvoice)>.+)</(ESQL|ProcessInvoice)>).*", Pattern.DOTALL);

我的问题实际上有两个方面:

  1. (Invoice|Package|Mapping|Post)部分仅与Invoice匹配,除非我从列表中删除Invoice。然后它只匹配映射。让我感到奇怪的是,Package位于文本块的中间(这些块在文本文件中按Invoice, Package, Mapping, Post排序,Post是可选的,所以它甚至可能不在那里),而映射则位于末尾。

  2. <(ESQL|ProcessInvoice)>部分实际上取ProcessInvoice块(最后一个块,最后经过三个<ESQL>块)。如果我去掉(ESQL|ProcessInvoice)部分,只把它做成<ESQL>,奇怪的是,它会再次占用Package块,而不是发票的第一个块。这仍然是一个问题,即使我将其缩减为以前的四个部分之一(因此,只有Invoice),任何地方都没有替换。它将跳过第一节,进入第二节。

我承认我不是正则表达式专家,但这似乎是一种相当奇怪的行为。在Matcher上调用.reset()也不会使其识别早期的块,并且.find()只定位一个匹配,而不是遍历所有可能的匹配。

---附录---示例输入如下(针对内容进行编辑):

CREATE COMPUTE MODULE Module_Name
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN       
    Header stuff,
    'Invoice' AS STAGE,
    Gibberish here
    '<Rule>
    <ESQL>
        ESQL Block 1
    </ESQL>
    <ESQL>
        ESQL Block 2
    </ESQL> 
    </Rule>' AS CONTENT);
    Header stuff,
    'Package' AS STAGE,
    Gibberish here
    '<Rule>
    <ESQL>
        ESQL Block 3
    </ESQL>
    </Rule>' AS CONTENT);
    Header stuff as well,
    'Mapping' AS STAGE,
    Gibberish here too
    '<ProcessInvoice>
        Another ESQL Block
    </ProcessInvoice>' AS CONTENT);
END;
END MODULE;

预期分组应(分别)为:

  1. 发票
  2. 包装
  3. 映射

数据:

  1. ESQL区块1ESQL区块2
  2. ESQL区块3
  3. 另一个ESQL块

我应该提到的是,我现在稍微修改了我的正则表达式,现在如下所示:

.*?'(Package|Invoice|Post)' AS STAGE.*?<Rule>(.+?)</Rule>.*?

这种交替现在似乎适用于四个可能的部分中的三个,但我相信我之前的部分问题是试图在另一个组中使用<(ESQL|ProcessInvoice)>。尝试不使用<Rule>(.+?)</Rule>.*?而只使用(<ESQL>.+?</ESQL>)现在不想工作。

我会将.*更改为.*?以使其不贪婪。这可能会对你有所帮助。

但实际上,您最好使用XML解析器。您说不能使用XML解析器,因为XML嵌入了其他文本中。然后,我建议您提取整个XML块(使用正则表达式或其他适当的方法),并将其放入XML解析器中。

相关内容

最新更新