我在获取正则表达式时遇到问题。我正在尝试为某些XML标记解析一个大的多行文本块。然而,我之所以不使用XML库来解析它,是因为它实际上也是ESQL块的一部分。我使用的线路如下:
Pattern.compile(".*'(Invoice|Package|Mapping|Post)' AS STAGE.*(<(ESQL|ProcessInvoice)>.+)</(ESQL|ProcessInvoice)>).*", Pattern.DOTALL);
我的问题实际上有两个方面:
(Invoice|Package|Mapping|Post)
部分仅与Invoice匹配,除非我从列表中删除Invoice。然后它只匹配映射。让我感到奇怪的是,Package位于文本块的中间(这些块在文本文件中按Invoice, Package, Mapping, Post
排序,Post是可选的,所以它甚至可能不在那里),而映射则位于末尾。<(ESQL|ProcessInvoice)>
部分实际上取ProcessInvoice
块(最后一个块,最后经过三个<ESQL>
块)。如果我去掉(ESQL|ProcessInvoice)
部分,只把它做成<ESQL>
,奇怪的是,它会再次占用Package块,而不是发票的第一个块。这仍然是一个问题,即使我将其缩减为以前的四个部分之一(因此,只有Invoice
),任何地方都没有替换。它将跳过第一节,进入第二节。
---附录---示例输入如下(针对内容进行编辑):
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;
预期分组应(分别)为:
- 发票
- 包装
- 映射
数据:
- ESQL区块1ESQL区块2
- ESQL区块3
- 另一个ESQL块
我应该提到的是,我现在稍微修改了我的正则表达式,现在如下所示:
.*?'(Package|Invoice|Post)' AS STAGE.*?<Rule>(.+?)</Rule>.*?
这种交替现在似乎适用于四个可能的部分中的三个,但我相信我之前的部分问题是试图在另一个组中使用<(ESQL|ProcessInvoice)>
。尝试不使用<Rule>(.+?)</Rule>.*?
而只使用(<ESQL>.+?</ESQL>)
现在不想工作。
我会将.*
更改为.*?
以使其不贪婪。这可能会对你有所帮助。
但实际上,您最好使用XML解析器。您说不能使用XML解析器,因为XML嵌入了其他文本中。然后,我建议您提取整个XML块(使用正则表达式或其他适当的方法),并将其放入XML解析器中。