当前位置: 首页 > 知识库问答 >
问题:

由于某种原因,模式匹配器没有查找所有匹配项

越俊驰
2023-03-14

我似乎有一项非常简单的任务,Matcher出于某种原因无法完成。

因此,任务听起来是这样的:您需要找到并显示字符串“aaabbb”中的所有子字符串,其中有成对的AA或BB,而它们可以排成一行或替换为“aabbbbaa”。可以单独使用“AAAA”或“BBBB”。

为了解决这个问题,我决定使用Pattern-Matcher,它应该搜索字符串中的所有匹配项。对于这项任务,我使用了模式:“(AA|BB)”,在我的理解中,它应该查找至少有一对AA或BB的所有子字符串。图片中有以下代码:

public class Main {
    public static void main(String[] args) {
        String s = "aaabbbb";
        Matcher matcher = Pattern.compile("(aa|bb)+").matcher(s);
        while(matcher.find())
            System.out.println(matcher.group());
    }
}

一切似乎都是正确的,所有适当的线条都应该出现,但我看到了这个答案:

Output:
    aa
    bbbb

在我看来,答案应该完全不同,因为我们有字符串“aaabbb”。让我们从字符串的第一个字符A开始,下一个也是A,它们一起组成一对。现在让我们从第二个字符开始-它也是A,以及3个字符也是A-这是第二对合适的字符。现在让我们看看2个字符的整个子字符串,A-这将是字符串AABBBB,它也符合我们的条件,就像所有其他字符串AABB、BB和BB一样。

为什么会这样?

UPD:我还决定补充一下为什么我认为我的理论是正确的。下面是以下代码,到处都输出true

public class Main {
    public static void main(String[] args) {
        System.out.println("AA".matches("(AA|BB)+"));
        System.out.println("AABBBB".matches("(AA|BB)+"));
        System.out.println("AABB".matches("(AA|BB)+"));
        System.out.println("BBBB".matches("(AA|BB)+"));
        System.out.println("BB".matches("(AA|BB)+"));
    }
}

共有1个答案

斜光耀
2023-03-14

匹配器的javadoc。find()表示:

此方法从该匹配器区域的开头开始,或者,如果之前成功调用了该方法,并且此后未重置匹配器,则从前一个匹配器未匹配的第一个字符开始。

如果匹配成功,则可以通过start、end和group方法获得更多信息,随后对find()方法的调用将从与此匹配不匹配的第一个字符开始。

因此,在您的主要示例中,第一个调用与AA匹配。然后第二个查找从第三个字符开始。

 类似资料:
  • 我在angular 5中实现了一个模式,在.ts文件中使用以下代码进行密码验证。这样做的目的是支持至少八个字符,至少一个大写字母、一个小写字母、一位数字和一个特殊字符。请参阅:密码的Regex必须包含至少八个字符、至少一个数字以及大小写字母和特殊字符 我明白了,当我在密码文本框中输入一个字符串时,例如< code>Niladri1!然而,当我输入一个类似于< code>Nopasss123!!,它

  • 问题内容: 从那时起,我一直在TutorialsPoint上查看代码,此后一直困扰着我……看一下这段代码: 此代码成功打印: 但是根据正则表达式,为什么它不返回其他可能的结果,例如: 要么 如果此代码不适合这样做,那么我该如何编写一个可以找到所有可能匹配项的代码? 问题答案: 这是因为的贪婪,随之而来的是回溯。 字串: 正则表达式: 我们都知道那是贪婪的,并且尽可能匹配所有字符。因此,第一个匹配所

  • 问题内容: 我使用Java中的正则表达式来捕获组,即使我知道表达式匹配,它也会不断抛出一个。 这是我的代码: 我期待是因为在正则表达式的捕获组拍摄的,而是我得到: IllegalStateException:找不到匹配项 我也尝试过,但发生相同的错误。 根据该文件,并: 捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式等于。 我究竟做错了什么? 问题答案: 是帮助程序类,它处理数据迭代以

  • 问题内容: 我正在解析的字符串中可能包含任意数量的带引号的字符串(我在解析代码,并尝试避免使用PLY)。我想找出是否有子字符串被引用,并且我有子字符串索引。我最初的想法是使用re查找所有匹配项,然后找出它们代表的索引范围。 似乎我应该将re与类似的正则表达式一起使用(目前,我避免使用三引号和此类字符串)。当我使用findall()时,会得到一个匹配字符串的列表,虽然有些不错,但我需要索引。 我的子

  • 这是一个示例文本:。我无法修改输入文本,我正在从文件中读取长字符串文本。 我想提取以下内容:,,, 为此,我编写了以下正则表达式模式: 我正在使用和类,但是我的Matcher无法使用前面提到的正则表达式找到模式。我在一些在线regex网站上用文本测试了这个regex,令人惊讶的是,它在那里工作。 我哪里做错了? 原始代码: 输出:未打印任何内容

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常