不情愿的量词表现贪婪
Reluctant quantifier acting greedy
我有这个代码:
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
现在我其实是想让它把找到的括号里的case分别找出来,所以要找:
[某物 234] 在一场比赛中
(一些事情)作为第二场比赛
任何人都可以帮助我相应地构建正则表达式吗?我不确定如何为整个正则表达式放置不情愿的量词,所以我将整个括号内的元素括在另一个括号中。但我不明白为什么这个不情愿的量词在这里表现得很贪婪,我需要做些什么来改变它?
正则表达式中的 {1}
是多余的,因为任何没有指定量词的元素都需要找到一次。同样使它 reluctant 没有意义,因为它没有描述 range 可能的重复(比如 {min,max}
其中添加 ?
会告诉正则表达式引擎使该范围内的重复次数尽可能接近 min
)。这里 {n}
描述了精确的重复次数所以 min
= max
= n
.
现在你应该可以通过.+
(括号内的内容)不情愿来解决你的问题。为此,请使用 .+?
.
所以试试:
String regex = "((\(|\[)(.+?)(\)|\]))";
我有这个代码:
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
现在我其实是想让它把找到的括号里的case分别找出来,所以要找: [某物 234] 在一场比赛中 (一些事情)作为第二场比赛
任何人都可以帮助我相应地构建正则表达式吗?我不确定如何为整个正则表达式放置不情愿的量词,所以我将整个括号内的元素括在另一个括号中。但我不明白为什么这个不情愿的量词在这里表现得很贪婪,我需要做些什么来改变它?
{1}
是多余的,因为任何没有指定量词的元素都需要找到一次。同样使它 reluctant 没有意义,因为它没有描述 range 可能的重复(比如 {min,max}
其中添加 ?
会告诉正则表达式引擎使该范围内的重复次数尽可能接近 min
)。这里 {n}
描述了精确的重复次数所以 min
= max
= n
.
现在你应该可以通过.+
(括号内的内容)不情愿来解决你的问题。为此,请使用 .+?
.
所以试试:
String regex = "((\(|\[)(.+?)(\)|\]))";