Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式:为什么在我的示例中不是最长的resp。左路比赛有人吗?_Java_Regex_Regex Greedy - Fatal编程技术网

Java正则表达式:为什么在我的示例中不是最长的resp。左路比赛有人吗?

Java正则表达式:为什么在我的示例中不是最长的resp。左路比赛有人吗?,java,regex,regex-greedy,Java,Regex,Regex Greedy,测试用例 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(); Strin

测试用例

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);
Pattern P1=Pattern.compile('%1!');
Pattern P2=Pattern.compile(“.*([0-9A-Za-z\+)\\})。*”;
String text=“a b”;
匹配器m=P1.匹配器(文本);
m、 匹配();
串g1=m组(1);
系统输出打印Ln(g1);
m=P2.匹配器(文本);
m、 匹配();
g1=m组(1);
系统输出打印Ln(g1);
输出

<{xyz}>
{xyz}

{xyz}
问题

我本以为P2的输出也是
,因为

  • 这是手术室的第一条规则
  • 匹配的
    {xyz}
我想我错过了什么,但不知道是什么。所以我的目标是,对于具有OR条件的模式,结果也是

口头目标如下: 匹配
{…}
中的内容,但如果输入是
,则将其作为首选项


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

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

将其更改为非贪婪型:

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