我在使用正则表达式时遇到问题。我正在尝试解析大型多行文本 block 以获取某些 XML 标记。然而,我没有使用 XML 库解析它的原因是它实际上也是 ESQL block 的一部分。我使用的线路如下:
Pattern.compile(".*'(Invoice|Package|Mapping|Post)' AS STAGE.*(<(ESQL|ProcessInvoice)>.+)</(ESQL|ProcessInvoice)>).*", Pattern.DOTALL);
我的问题实际上有两个方面:
(Invoice|Package|Mapping|Post)
部分仅与发票匹配,除非我从列表中删除发票。然后它只匹配 Mapping。让我感到奇怪的是,Package 位于文本 block 的中间(这些 block 在文本文件中按Invoice, Package, Mapping, Post
排序,Post 是可选的,因此它甚至可能不存在),而映射位于末尾。<(ESQL|ProcessInvoice)>
部分实际上需要ProcessInvoice
block (最后一个 block ,最后经过三个<ESQL>
block )。如果我删除(ESQL|ProcessInvoice)
部分并完成<ESQL>
奇怪的是,它会再次采用 Package block ,而不是 Invoice 的第一个 block 。即使我将其削减为之前的四个部分之一(因此,只是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 block 1 ESQL block 2
- ESQL block 3
- 另一个 ESQL block
我应该提到我现在稍微改变了我的正则表达式来解释 ,现在如下:
.*?'(Package|Invoice|Post)' AS STAGE.*?<Rule>(.+?)</Rule>.*?
这种交替现在似乎适用于四个可能部分中的三个,但我相信我之前遇到的部分问题是尝试使用 <(ESQL|ProcessInvoice)>
另一个组里面。尝试没有<Rule>(.+?)</Rule>.*?
甚至只是 (<ESQL>.+?</ESQL>)
现在不想工作。
最佳答案
我会将 .*
更改为 .*?
以使其非贪婪。这可能会对您有所帮助。
但实际上,您最好使用 XML 解析器。您说不能使用 XML 解析器,因为 XML 嵌入在其他文本中。然后我建议您提取整个 XML block (使用正则表达式或其他适当的方法)并将其放入 XML 解析器中。
关于java - Java 正则表达式和交替的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9726132/