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

Java集匹配器结果以捕获模式顺序

苗征
2023-03-14

我并不是在问regex模式,而是更多地问它的捕获组。我正在尝试将匹配项与正确的捕获组相关联。例如,字符串:>>>>>!something!将使用以下模式将100个num***<<<:设置到匹配器组1-6中:

(>>>>)|(!something!)|(\d{3})|(\w+)|(\*)+|(<<<<)

那么假设您有字符串101 any<<<。它匹配捕获组346。匹配器将匹配项放入123。是否可以设置数组中的匹配以与捕获组相同的方式放置--以这样的顺序填充数组中的空元素?本质上,我想调用匹配器数组,它返回empty empty 101 any empty<<<

List n = new ArrayList();
  for(int i = 0; i < 6; i++) {
   n.add(matcher.group(i));
}

如果匹配器找到了字符串的所有捕获组,则该操作有效,但如果字符串缺少任何内容,则不起作用。

共有1个答案

施念
2023-03-14

下面是匹配器#group(int)的java文档

返回给定组在上一次匹配操作期间捕获的输入子序列。对于匹配器m、输入序列s和组索引g,表达式m.group(g)和s.substring(m.start(g),m.end(g))是等价的。

捕获组从左到右索引,从1开始。组zero表示整个模式,因此表达式m.Group(0)等价于m.Group()。

如果匹配成功,但指定的组未能匹配输入序列的任何部分,则返回null。请注意,某些组(例如(a*))与空字符串匹配。当这样的组与输入中的空字符串成功匹配时,此方法将返回空字符串。

因此,为了使用捕获组概念,您的模式应该与字符串完全匹配。希望这有帮助。

编辑

我想你在找像这样的东西。

    Pattern p = Pattern.compile("(>>>>)?(!something!)?([\\d]{3})?([\\w]+)?([\\*]+)?(<<<<)");
    String s1 = ">>>>!something!100num***<<<<";

    Matcher m = p.matcher(s1);
    if(m.matches()) {
        for(int i=1;i<=m.groupCount();i++) {
            System.out.println("Group " + i + ": " + m.group(i));
        }
    }

    s1 = "101any<<<<";

    m = p.matcher(s1);
    if(m.matches()) {
        for(int i=1;i<=m.groupCount();i++) {
            System.out.println("Group " + i + ": " + m.group(i));
        }
    }
Group 1: >>>>
Group 2: !something!
Group 3: 100
Group 4: num
Group 5: ***
Group 6: <<<<

Group 1: null
Group 2: null
Group 3: 101
Group 4: any
Group 5: null
Group 6: <<<<

希望这能帮助你走向正确的方向。

 类似资料:
  • 我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

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

  • 在使用模式匹配时,此示例可能会被讨论为“gotcha”: 这是一个使用结构模式匹配进行意外捕获的示例。它提供了以下意外输出: 同样的问题也以其他形式出现: 在此示例中,需要有括号,。没有它们,它“捕获”并将str内置类型替换为x的值。 是否有防御性编程实践可以帮助避免这些问题并提供早期检测?

  • 问题内容: 有没有一种方法可以使我按照WHERE命令中要求的顺序使mysql从成员数据库返回结果? 目前,无论我做什么,它将返回MemberID ASC排序的结果。我希望它能按我要求的顺序返回6,3,5。 问题答案:

  • 问题内容: 我有以下路线: / /close / / 如果我向发出请求 ,Flask将其匹配为模式2,将字符串“ close”分配给 参数。如何使 路线在 路线之前匹配? 问题答案: 我错过了: 对于static端点: 为 为 这意味着的优先级高于其他优先级,并且优先级高于。 例: 输出: 看起来这是正确的行为。

  • 我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?