Java 表现贪婪的不情愿量词

Java 表现贪婪的不情愿量词,java,regex,reluctant-quantifiers,Java,Regex,Reluctant Quantifiers,我有以下代码: String result = text; String regex = "((\\(|\\[)(.+)(\\)|\\])){1}?"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(result); System.out.println("start"); System.out.println(result); while

我有以下代码:

String result = text;

    String regex = "((\\(|\\[)(.+)(\\)|\\])){1}?";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(result);

    System.out.println("start");
    System.out.println(result);
    while (matcher.find()) {
        System.out.print("Start index: " + matcher.start());
        System.out.print(" End index: " + matcher.end() + " ");
        System.out.println(matcher.group());
    }
    System.out.println("finish");
我有一个字符串要匹配:

Some text sentence or sentences [something 234] (some things)
以及执行时得到的输出:

start
some text sentence or sentences [something 234] (some things)
Start index: 32 End index: 61 [something 234] (some things)
finish
现在我想让它分别在括号中找到找到的案例,以便找到: 在一场比赛中 (一些事情)作为第二场比赛


有人能帮我建立相应的正则表达式吗?我不确定如何将不情愿的量词放在整个正则表达式中,因此我将整个括号中的元素放在另一个括号中。但是我不明白为什么这个不情愿的量词在这里表现得贪婪,我需要做什么来改变它呢?

{1}
在正则表达式中是多余的,因为任何没有指定量词的元素都需要找到一次。另外,让它不情愿也没有意义,因为它没有描述可能重复的范围(比如
{min,max}
,其中添加
将告诉正则表达式引擎使该范围内的重复次数尽可能接近
min
)。这里
{n}
描述了精确的重复次数,因此
min
=
max
=
n

现在,您应该能够通过使
+
(括号中的内容)不情愿来解决您的问题。为此,请使用
+?

因此,请尝试:

String regex = "((\\(|\\[)(.+?)(\\)|\\]))";

您是否希望
[]
()
中的内容?
+
不是贪婪的<代码>+?将是多余的。另外,
{1}?
似乎是多余的。另外,交替也可能是多余的avoided@rock321987是的,我需要每个括号内的内容。嗯,似乎有效,但我仍然不明白让量词不愿意括号之间的内容如何使ir有效?为什么把它放在那里,因为我正在搜索括号和内容的匹配,而不仅仅是内容?我完全糊涂了,我永远不会想到在内容上添加不情愿的修改器……试着想想单个结果应该是什么样子。它应该是
(…)
[…]
。因此,如果您有像
aaa(foo)[bar]baz
这样的字符串,regex应该能够找到(必需的)
,以及它们之间的小范围字符。这就是为什么我们要使用
+
,它表示
[
]
)之间的字符。也许本教程可以更好地解释这一点: