【问题标题】:Reluctant quantifier acting greedy [duplicate]不情愿的量词贪婪[重复]
【发布时间】:2016-06-05 12:51:22
【问题描述】:

我有这个代码:

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

现在我实际上希望它在括号中分别找到找到的案例,所以要找到: [东西 234] 在一场比赛中 (一些东西)作为第二场比赛

任何人都可以帮助我相应地构建正则表达式吗?我不确定如何为整个正则表达式放置不情愿的量词,所以我将整个括号内的元素括在另一个括号中。但我不明白为什么这个不情愿的量词在这里表现得很贪婪,我需要做些什么来改变它?

【问题讨论】:

  • 你想要[]()里面的内容吗?
  • .+ 并不贪心。 .+? 会。
  • 另外{1}? 似乎是多余的。
  • 另外,可以避免交替
  • @rock321987 是的,我需要每个括号内的内容

标签: java regex reluctant-quantifiers


【解决方案1】:
正则表达式中的

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

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

那就试试吧:

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

【讨论】:

  • 嗯,似乎有效,但我仍然不明白如何让量词不愿意括号之间的内容使他们工作?为什么要放在那里,因为我正在搜索括号和内容的匹配项,而不仅仅是内容?我完全糊涂了,我永远不会想到将不情愿的修饰符放在内容上......
  • 试着想想单个结果应该是什么样子。它应该是(...)[...]。因此,如果您有像 aaa (foo) [bar] baz 这样的字符串,正则表达式应该能够找到(强制)() 以及它们之间的小范围字符。这就是为什么我们制作 .+ 表示介于 ( [] ) 不情愿(最小)之间的字符的原因。也许本教程会更好地解释它:regular-expressions.info/repeat.html#lazy
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多