java - Java 正则表达式和交替的问题

标签 java regex multiline alternation

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

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

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

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

  2. <(ESQL|ProcessInvoice)>部分实际上需要 ProcessInvoice block (最后一个 block ,最后经过三个 <ESQL> block )。如果我删除 (ESQL|ProcessInvoice)部分并完成<ESQL>奇怪的是,它会再次采用 Package block ,而不是 Invoice 的第一个 block 。即使我将其削减为之前的四个部分之一(因此,只是 Invoice ),并且在任何地方都没有替换,这仍然是一个问题。它将跳过第一部分并进入第二部分。

我承认我不是正则表达式专家,但这似乎是相当奇怪的行为。在 Matcher 上调用 .reset() 也不会让其识别较早的 block ,并且 .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 block 1 ESQL block 2
  2. ESQL block 3
  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/

相关文章:

java - 如何创建 jabber/XMPP 代理/日志服务?

java - XmlSerializer 编码

用于识别 XdY+Z OR XdY 的正则表达式

java - Java正则表达式不匹配

c# 如何使用 Regex.IsMatch 检查每一行

javascript - 多行文本溢出(dotdotdot): wrap only word

mysql - 在查询脚本中的后续查询中使用多行响应

java - 如何防止 Java 中对象的状态发生变化(相对于 FP)?

java - 有效地合并和重新排序已排序的列表

Javascript替换所有不在双引号中的逗号