gpt4 book ai didi

Java 正则表达式过于贪婪地捕获组

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:11 25 4
gpt4 key购买 nike

    Node0x7fd34984d728:s1 -> Node0x7fd34984d600:d0;
Node0x7fd34984d850 [shape=record,shape=Mrecord,label="{Register %vreg13|0x7fd34984d850|{<d0>i32}}"];
Node0x7fd34984d978 [shape=record,shape=Mrecord,label="{{<s0>0|<s1>1}|CopyFromReg [ORD=1]|0x7fd34984d978|{<d0>i32|<d1>ch}}"];
Node0x7fd34984d978:s0 -> Node0x7fd3486095f0:d0[color=blue,style=dashed];
Node0x7fd34984d978:s1 -> Node0x7fd34984d850:d0;
Node0x7fd34984daa0 [shape=record,shape=Mrecord,label="{Register %vreg14|0x7fd34984daa0|{<d0>i32}}"];

我试图只捕获带有“ORD”关键字的节点,我的简单正则表达式模式是:

Node.+?label=\"\\{\\{(?<SRC><s[0-9]+?>[a-z0-9]+?)\\}|(?<NAME>.+?)\\[ORD=(?<ORD>[0-9]+?)\\]\\|(?<ID>[A-Za-z0-9]{14})|\\{(?<DEST><d[0-9]+?>[a-z0-9]+?)\\}\\}\"\\];

抓错群太贪心了。

以下片段被捕获为一组!

Node0x7fd34984d728:s1 -> Node0x7fd34984d600:d0;
Node0x7fd34984d850 [shape=record,shape=Mrecord,label="{Register %vreg13|0x7fd34984d850|{<d0>i32}}"];
Node0x7fd34984d978 [shape=record,shape=Mrecord,label="{{<s0>0|<s1>1}|CopyFromReg [ORD=1]|0x7fd34984d978|{<d0>i32|<d1>ch}}"];

但是它只能捕获:

Node0x7fd34984d978 [shape=record,shape=Mrecord,label="{{<s0>0|<s1>1}|CopyFromReg [ORD=1]|0x7fd34984d978|{<d0>i32|<d1>ch}}"];

因为它是唯一的 NodeSemicolon 之前有“ORD”关键字

最佳答案

您需要摆脱任何惰性和点匹配模式,并将它们替换为否定字符类。这样,您将防止子字符串的各个部分之间“溢出”。

String pattern = "Node[^\\]\\[]*\\[[^\\]\\[]*label=\"\\{\{(?<SRC>[^{}]*)\\}\\|(?<NAME>\\w+)\\s*\\[ORD=(?<OR‌​D>\\d+)\\]\\|(?<ID>[^|]*)\\|\\{(?<DEST>[^{}]*)\\}\\}\"\\];";

参见 demo

关于Java 正则表达式过于贪婪地捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com