gpt4 book ai didi

Java 正则表达式 : Why is in my sample not the longest resp. 左匹配已被采用?

转载 作者:行者123 更新时间:2023-12-02 04:15:21 25 4
gpt4 key购买 nike

测试用例

Pattern P1 = Pattern.compile(".*(<\\{([0-9A-Za-z_]+)\\}>).*");
Pattern P2 = Pattern.compile(".*(<\\{([0-9A-Za-z_]+)\\}>|\\{([0-9A-Za-z_]+)\\}).*");

String text = "a <{xyz}> b";

Matcher m = P1.matcher(text);
m.matches();
String g1 = m.group(1);
System.out.println(g1);

m = P2.matcher(text);
m.matches();
g1 = m.group(1);
System.out.println(g1);

输出

<{xyz}>
{xyz}

问题

我预计,对于 P2,输出也将是 <{xyz}>因为

  • 这是 OR 中的第一条规则
  • 比赛<{xyz}>长于{xyz}

我想我错过了一些东西,但不知道是什么。所以我的目标是对于具有 OR 条件的模式,结果是 <{xyz}> .

口头目标是这样的:匹配 <{...}> 内的任意内容或{...}但如果输入是 <> ,然后将此作为首选。

目前我想到的唯一解决方案是将 P2 拆分为两个正则表达式,然后首先使用 <> 将输入应用到该表达式。如果这不匹配,请尝试另一个不带 <> 的选项。但我很好奇这如何仅使用一个正则表达式。

最佳答案

问题是第二个正则表达式开头的贪婪 .* 在允许 (...) 中的模式之前匹配最长的匹配。

将其改为非贪婪的:

.*?(<\{([0-9A-Za-z_]+)\}>|\{([0-9A-Za-z_]+)\}).*

RegEx Demo

关于Java 正则表达式 : Why is in my sample not the longest resp. 左匹配已被采用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376207/

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